programing

루비에서 &.(앰퍼샌드 도트)는 무엇을 의미합니까?

batch 2023. 6. 5. 23:45
반응형

루비에서 &.(앰퍼샌드 도트)는 무엇을 의미합니까?

저는 이 루비 코드 라인을 우연히 발견했습니다.가 입니까?&.이 안에서 비열한?

@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

반응형