[ruby] 루비에서 || = (또는 같음)은 무엇을 의미합니까?

루비에서 다음 코드는 무엇을 의미합니까?

||=

구문에 대한 의미 나 이유가 있습니까?



답변

이 질문은 루비 메일 링리스트와 루비 블로그에서 자주 논의되었는데, 이제 루비 메일 링리스트에이 문제를 논의하는 루비 메일 링리스트 의 다른 모든 스레드 에 대한 링크를 수집하는 것이 유일한 목적인 스레드도 있습니다. .

하나는 다음과 같습니다. || = (또는 동일한) 스레드 및 페이지의 최종 목록

당신이 경우 정말 무슨 일이 일어나고 있는지 알고 싶어의 “단축 할당”섹션 11.4.2.3 한 번 봐 걸릴 루비 언어 초안 사양 .

첫 번째 근사치로

a ||= b

에 해당

a || a = b

하지 에 해당

a = a || b

그러나 특히 a정의되지 않은 경우 첫 번째 근사치 입니다. 시맨틱은 단순 변수 할당, 메소드 할당 또는 인덱싱 할당인지에 따라 다릅니다.

a    ||= b
a.c  ||= b
a[c] ||= b

모두 다르게 취급됩니다.


답변

a ||= bA는 조건 할당 연산자 . 이 수단 경우 a미정되거나 falsey 후 평가 b및 집합 a결과로 . 마찬가지로 a정의되고 진실로 b평가되면 평가되지 않으며 할당이 수행되지 않습니다. 예를 들면 다음과 같습니다.

a ||= nil # => nil
a ||= 0 # => 0
a ||= 2 # => 0

foo = false # => false
foo ||= true # => true
foo ||= false # => true

혼란스럽게도 다른 할당 연산자 (예 :)와 비슷 +=하지만 다르게 동작합니다.

  • a += b 로 번역 a = a + b
  • a ||= b 대략적으로 a || a = b

의 속기입니다 a || a = b. 차이는 때이다 a정의되지 a || a = b올리는 것 NameError반면, a ||= b세트 ab. 이 구별은 경우 중요하지 않습니다 ab로컬 변수가 있지만 하나가 클래스의 게터 / setter 메소드의 경우 중요합니다.

더 읽을 거리 :


답변

간결하고 완전한 답변

a ||= b

다음 줄과 동일한 방식으로 평가

a || a = b
a ? a : a = b
if a then a else a = b end

반면에

a = a || b

다음 줄과 동일한 방식으로 평가

a = a ? a : b
if a then a = a else a = b end

편집 : AJedi32가 주석에서 지적했듯이 다음과 같은 경우에만 적용됩니다. 1. a는 정의 된 변수입니다. 2. 한 번 및 두 번 평가해도 프로그램 또는 시스템 상태에는 차이가 없습니다.


답변

짧은에서 a||=b수단 : 만약이 a있다 undefined, nil or false, 할당 ba. 그렇지 않으면 a그대로 유지하십시오.


답변

원래,

x ||= y 방법

경우 x모든 값을 갖고, 그렇지 않으면 설정, 혼자 떠나 값을 변경하지 않습니다 xy


답변

또는 같음을 의미합니다. 왼쪽의 값이 정의되어 있는지 확인한 다음 사용하십시오. 그렇지 않은 경우 오른쪽의 값을 사용하십시오. Rails에서이를 사용하여 모델에서 인스턴스 변수를 캐시 할 수 있습니다.

현재 로그인 한 사용자를 가져 오는 함수를 생성하는 빠른 Rails 기반 예제 :

class User > ActiveRecord::Base

  def current_user
    @current_user ||= User.find_by_id(session[:user_id])
  end

end

@current_user 인스턴스 변수가 설정되어 있는지 확인합니다. 있는 경우이를 리턴하여 데이터베이스 호출을 저장합니다. 그러나 설정되어 있지 않으면 호출 한 다음 @current_user 변수를 설정합니다. 실제로 간단한 캐싱 기술이지만 응용 프로그램에서 동일한 인스턴스 변수를 여러 번 가져올 때 유용합니다.


답변

x ||= y

이다

x || x = y

“x가 거짓이거나 정의되지 않은 경우 x는 y를 가리 킵니다.”