루비에서 다음 코드는 무엇을 의미합니까?
||=
구문에 대한 의미 나 이유가 있습니까?
답변
이 질문은 루비 메일 링리스트와 루비 블로그에서 자주 논의되었는데, 이제 루비 메일 링리스트에이 문제를 논의하는 루비 메일 링리스트 의 다른 모든 스레드 에 대한 링크를 수집하는 것이 유일한 목적인 스레드도 있습니다. .
하나는 다음과 같습니다. || = (또는 동일한) 스레드 및 페이지의 최종 목록
당신이 경우 정말 무슨 일이 일어나고 있는지 알고 싶어의 “단축 할당”섹션 11.4.2.3 한 번 봐 걸릴 루비 언어 초안 사양 .
첫 번째 근사치로
a ||= b
에 해당
a || a = b
와 하지 에 해당
a = a || b
그러나 특히 a
정의되지 않은 경우 첫 번째 근사치 입니다. 시맨틱은 단순 변수 할당, 메소드 할당 또는 인덱싱 할당인지에 따라 다릅니다.
a ||= b
a.c ||= b
a[c] ||= b
모두 다르게 취급됩니다.
답변
a ||= b
A는 조건 할당 연산자 . 이 수단 경우 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
세트 a
로 b
. 이 구별은 경우 중요하지 않습니다 a
및 b
로컬 변수가 있지만 하나가 클래스의 게터 / 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
, 할당 b
에 a
. 그렇지 않으면 a
그대로 유지하십시오.
답변
x ||= y
방법
경우 x
모든 값을 갖고, 그렇지 않으면 설정, 혼자 떠나 값을 변경하지 않습니다 x
에y
답변
또는 같음을 의미합니다. 왼쪽의 값이 정의되어 있는지 확인한 다음 사용하십시오. 그렇지 않은 경우 오른쪽의 값을 사용하십시오. 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를 가리 킵니다.”
