루비에서 &.(앰퍼샌드 도트)는 무엇을 의미합니까?
저는 이 루비 코드 라인을 우연히 발견했습니다.가 입니까?&.
이 안에서 비열한?
@object&.method
그것은 안전 항법 수술자라고 불립니다..0에 이은 객체가 Ruby 2.3.0일 수도 할 수 . 객체에 대한 메소드는 객체가nil
((undefined method for nil:NilClass
오류), 레일즈의 방법과 유사합니다.
그래서 당신은 쓸 수 있습니다.
@person&.spouse&.name
대신에
@person.spouse.name if @person && @person.spouse
문서에서:
my_object.my_method
이것은 다음을 보냅니다.
my_method
에게 보내는 메시지.my_object
모든 물체는 수신기가 될 수 있지만, 방법의 가시성에 따라 메시지를 보내는 것이 다음과 같이 발생할 수 있습니다.NoMethodError
.사용할 수 있습니다.
&.
수자를지려면정하그, 면러신면▁to.my_method
는 " 되지않며결과는으호"입니다.nil
때.nil
그경우, 다과같있의 .my_method
평가되지 않습니다.
참고: @Santosh가 명확하고 완전한 답변을 주었지만, 저는 몇 가지 배경을 추가하고 비 인스턴스 변수와 함께 사용하는 것과 관련하여 중요한 참고 사항을 추가하고 싶습니다.
"안전한 탐색 운영자"("옵션 체인 운영자", "Null 조건부 운영자" 등)라고 합니다.Matz는 그것을 "외로운 연산자"라고 부르는 것 같습니다.루비 2.3에 도입되었습니다.그렇지 않은 경우에만 메서드를 개체로 보냅니다.nil
.
예:
# Call method `.profile` on `user` only if `user` is not `nil`
@user&.profile
# Equivalent to
unless @user.nil?
@user.profile
end
로컬 변수가 있는 "엣지 케이스":
위 코드는 인스턴스 변수를 사용합니다.로컬 변수와 함께 안전한 탐색 연산자를 사용하려면 먼저 로컬 변수가 정의되었는지 확인해야 합니다.
# `user` local variable is not defined previous
user&.profile
# This code would throw the following error:
NameError: undefined local variable or method `user' for main:Object
이 문제를 해결하려면 로컬 변수가 먼저 정의되어 있는지 확인하거나 0으로 설정하십시오.
# Option 1: Check the variable is defined
if defined?(user)
user&.profile
end
# Option 2: Define your local variable. Example, set it to nil
user = nil
user&.profile # Works and does not throw any errors
메서드 배경
는 레즈는입니다.try
기본적으로 같은 일을 하는 방법.그것은 사용합니다.send
메서드를 호출하는 메서드입니다.Matz는 그것이 느리고 이것이 내장된 언어 기능이어야 한다고 제안했습니다.
다른 많은 프로그래밍 언어들도 비슷한 기능을 가지고 있습니다.목표 C, 스위프트, 스칼라, 커피스크립트 등그러나 일반적인 구문은 다음과 같습니다.?.
(으)ㄹ 수 있습니다.이Ruby에 .그러나 이 구문은 Ruby에 의해 채택되지 않았습니다. ㅠㅠ?
할 수 드이사수있으로므할용름에메소,▁was,▁thus▁names므로있으▁and▁method.?.
기호 시퀀스가 이미 유효한 루비 코드입니다.예:
2.even?.class # => TrueClass
그래서 루비 커뮤니티는 다른 구문을 생각해내야 했습니다.되었습니다..?
,?
,&&
은 몇 가지 사항 입니다.다음은 몇 가지 고려 사항 목록입니다.
u.?profile.?thumbnails
u\profile\thumbnails
u!profile!thumbnails
u ? .profile ? .thumbnails
u && .profile && .thumbnails
# And finally
u&.profile&.thumbnails
구문을 선택하는 동안 개발자들은 다양한 에지 사례를 살펴보았으며 토론은 매우 유용합니다.운영자의 모든 변형과 뉘앙스를 살펴보려면 공식 Ruby 이슈 추적기에서 이 기능 소개 토론을 참조하십시오.
조심하세요!안전한 내비게이션 조작자는 편리하지만, 사용자 자신을 속여서 논리를 변경하는 것도 마찬가지입니다.흐름 제어에 사용하지 않는 것이 좋습니다.예:
str = nil
puts "Hello" if str.nil? || str.empty?
# The above line is different than the below line
puts "Hello" if str&.empty?
번째에서는, 첫번째예는서에,는서,str.nil?
아온다를 합니다.true
그리고.str.empty?
절대로 호출되지 않아, 원인이 됩니다.puts
실행할 문입니다.두 에서는 그나두번예에는서째러,는▁in,str&.empty?
아온다를 합니다.nil
이고, 그은거고이짓고, 그리것고.puts
문이 실행되지 않습니다.
safe navigation operator (&.):
수신기가 0이 아닐 경우에만 다음 메소드를 호출하라고 루비에게 말합니다.그렇지 않으면 식이 0을 반환합니다.
실용적인 작동 중
▁a를 해 봅시다.Roster
.Sports team
.Roster
을 합니다.multiple Player
물건들.
class Roster
attr_accessor :players
end
class Player
attr_accessor :name, :position
def initialize(name, position)
@name = name
@position = position
end
end
이 두 가지 목표를 통해 2대 2 여자 농구 토너먼트에 참가할 선수 명단을 작성할 수 있습니다.
moore = Player.new("Maya Moore", "Forward")
taurasi = Player.new("Diana Taurasi", "Guard")
tourney_roster1 = Roster.new
tourney_roster1.players = [moore, taurasi]
가 우리우가리의포알싶다면고를워드의 를 알고 싶다면,2-on-2
팀, 우리는 다음과 같은 방법으로 이름을 찾을 수 있습니다.
if tourney_roster1.players.first.position == "Forward"
puts "Forward: #{tourney_roster1.players.first.name}"
end
하지만 우리의 상대 선수 명단이 정확하게 설정되지 않으면 어떻게 합니까?
tourney_roster2 = Roster.new
if tourney_roster2.players.first.position == "Forward"
puts "Forward: #{tourney_roster1.players.first.name}"
end
tourney_roster2
아직 어떤 플레이어와도 설정되지 않았습니다.이전 코드는 다음을 발생시킵니다.NoMethodError because tourney_roster2.players returns nil
이를 방지하기 위해 조건문을 추가할 수 있지만, 이를 통해 if문이 장황하고 불분명해집니다.
if tourney_roster2.players &&
tourney_roster2.players.first &&
tourney_roster2.players.first.position == "Forward"
대신 안전한 탐색 연산자를 사용하여 NoMethodError를 피할 수 있습니다.
if tourney_roster2.players&.first&.position == "Forward"
puts "Forward: #{tourney_roster1.players.first.name}"
end
따라서,
>> tourney_roster2.players&.first == nil
#=> true
>> tourney_roster2.players&.first&.position == nil
#=> true
일부 합법적인 사용 사례:여기에 표시된 것처럼 여러 개체로 작업할 때와 방법을 함께 연결할 때 안전한 탐색 조작자가 유용합니다.
예를 들어, 객체 -> 스위프트 및 코틀린과 같이 영 체크에 사용됩니다.
model = car?.model
이 모델은 차량 클래스에서 모델 값을 정의하지 않은 경우 0(Swift) 또는 null(Kotlin)일 수 있습니다.우리는 루비의 물음표 대신 앰퍼샌드를 사용합니다.
model = car&.model
앰퍼샌드가 없는 car.model을 사용하고 모델이 0인 경우 시스템을 계속 실행할 수 없습니다.
여기 제가 이것에 대해 발견한 짧은 읽기(3분)가 있습니다 - 꽤 좋습니다.
위에 덧붙이자면, 그것은 다음과 같은 역할을 합니다.try!
메소드는 레일즈에 있습니다.try
방법.
왜냐하면 그것은 a를 올릴 것이기 때문입니다.NoMethodError
수신기가 0이 아니고 시도된 방법을 구현하지 않는 경우 예외.
위의 기사에서 인용한 예:
account = Account.new(owner: Object.new)
account&.owner&.address
# => NoMethodError: undefined method `address' for #<Object:0x00559996b5bde8>`
account.try(:owner).try(:address)
# => nil
account.try!(:owner).try!(:address)
# => NoMethodError: undefined method `address' for #<Object:0x00559996b5bde8>`
은 Typescript와 .?
입니다.
뜻입니까?
object&.an_attribute
루비로 레일에?
저는 루비 온 레일즈에 새로 왔고 이런 종류의 코드를 보았지만 이해할 수 없습니다.
루비에서는 대부분의 주류 프로그래밍 언어와 마찬가지로 사용자 코드가 프로그래밍 언어의 기본 작동을 수정할 수 없으며 프로그래밍 언어의 구문도 변경할 수 없습니다.
Ruby on Rails는 단지 Ruby 코드이기 때문에 이것이 Ruby on Rails와 전혀 관련이 없다는 것을 즉시 알 수 있어야 합니다.
따라서 우리는 Ruby on Rails가 아닌 Ruby를 살펴봐야 합니다.
안전한 탐색 작업자 또는 안전한 탐색기는 에 지정되어 있으며, 특히 다음과 같습니다.
context "when context is nil" do it "always returns nil" do eval("nil&.unknown").should == nil eval("[][10]&.unknown").should == nil end it "can be chained" do eval("nil&.one&.two&.three").should == nil end it "doesn't evaluate arguments" do obj = Object.new obj.should_not_receive(:m) eval("nil&.unknown(obj.m) { obj.m }") end end
Ruby Syntax 문서의 호출 방법 섹션에 설명되어 있습니다.
&.
operator라고 가 " 안전한라내운영자불", " 기가다때호다는건수있메출니습리을너뛸드서음일수"일 때 수 .nil
를 합니다.nil
호출을 건너뛸 경우 메서드의 인수를 평가하지 않습니다.
언급URL : https://stackoverflow.com/questions/36812647/what-does-ampersand-dot-mean-in-ruby
'programing' 카테고리의 다른 글
Typescript/Vue - Prop의 기본 개체를 선언할 때 vuex 저장소에 액세스하려면 어떻게 해야 합니까? (0) | 2023.06.10 |
---|---|
프로젝트의 루트 디렉터리에서 텍스트 파일을 읽는 방법은 무엇입니까? (0) | 2023.06.10 |
UITextView에서 클릭 링크를 가로채는 방법은 무엇입니까? (0) | 2023.06.05 |
소수 자릿수 형식 지정(R) (0) | 2023.06.05 |
장고 모델에서 목록을 저장하는 가장 효율적인 방법은 무엇입니까? (0) | 2023.06.05 |