루비 : 부울 속성 명명 컨벤션 및 사용
-
13-09-2019 - |
문제
Ruby 학습. 부울 속성이 다음과 같이 명명되어야한다는 인상을받습니다.
my_boolean_attribute?
그러나 다음을 수행하려고 할 때 구문 오류가 발생합니다.
class MyClass
attr_accessor :my_boolean_attribute?
def initialize
:my_boolean_attribute? = false
end
end
분명히 루비는 "?"를 미워하고 있습니다. 이것이 컨벤션입니까? 내가 뭘 잘못하고 있죠?
해결책
편집 : 3 년 후; 타임즈, 그들은 a-changin '입니다…
줄릭의 대답 요즘 문제를 해결하는 가장 간단하고 가장 좋은 방법입니다.
class Foo
attr_accessor :dead
alias_method :dead?, :dead # will pick up the reader method
end
원래 질문에 대한 나의 대답은 후손에 대해 다음과 같습니다.
짧은 버전 :
인스턴스 변수의 이름으로 물음표를 사용할 수 없습니다.
더 긴 버전 :
예를 들어, attr_accessor :foo
- 그것의 간단히 개념적으로 다음을위한 약간의 구문 설탕 :
def foo
@foo
end
def foo=(newfoo)
@foo = newfoo
end
또한, 질문 마크 접미사는 대부분 메소드의 반환 값이 부울임을 나타내는 규칙 일뿐입니다.
당신이 여기서 무엇을하고 있는지에 대해 내가 할 수있는 가장 좋은 근사치…
class MyClass
def initialize
@awesome = true
end
def awesome?
@awesome
end
end
이 경우 사용해야 할 경우가있을 수 있습니다. attr_accessor
- 결국, 부울 속성으로 직접 일하고 있음이 분명 할 수 있습니다. 일반적으로 부울 반환 값이 속성 값보다 약간 더 복잡한 조건을 기반으로하는 메소드를 구현할 때 질문 표시 접미사를 저장합니다.
건배!
2 년 후, 최근의 의견 후 편집 :
- 루비는 특정 명명 규칙을 시행합니다.
루비의 기호는 물음표를 가질 수 없습니다. 따라서의 호출편집 : 정확하지 않음, 인용 된 구문을 기호에 사용하십시오 (예 ::my_boolean_attribute?
둘 다 aNameError
.:"my_attribute?"
- 기호는 불변이지만, 하나에 할당하려고 시도하면
SyntaxError
.
다른 팁
"질문 방법"을 신속하게 추가하는 가장 쉬운 방법은 독자 방법에 별명을 사용하는 것입니다.
class Foo
attr_accessor :dead
alias_method :dead?, :dead # will pick up the reader method
end
그만큼 attr_accessor
기호는 변수 이름이임을 의미합니다 @my_boolean_attribute
, 그것이 당신이 설정해야 할 것입니다 (심볼이 아님).
또한 사용할 수 없습니까? 변수의 경우 메소드 이름 만 있습니다.
? 변수가 아닌 메소드 이름의 규칙입니다. 이름이 지정된 인스턴스 변수를 사용할 수 없습니다 @foo?
, 그러나 이름이 지정된 변수를 사용할 수 있습니다 @foo
그리고 (수동으로 생성 된) getter 방법의 이름을 지정하십시오 foo?
원한다면.
Monkey -Patching Metaprogramming- 아마도 더 우아하게 만들 수 있습니다. 이것은 빠른 초안 일뿐입니다. 그리고 나는 잠시 동안 메타 프로 그램을하지 않았습니다 ...
# inject the convenience method into the definition of the Object class
class Object
def Object::bool_attr(attrname)
class_eval { define_method(attrname.to_s,
lambda { instance_variable_get('@' + attrname.to_s.chop) }) }
class_eval { define_method(attrname.to_s.chop+"=",
lambda { |x| instance_variable_set('@'+attrname.to_s.chop, x) }) }
end
end
### somewhere later
class MyClass
bool_attr :my_boolean_attribute?
def initialize
@my_boolean_attribute = true
end
end
# yet even more later
foo = MyClass.new
bar = MyClass.new
foo.my_boolean_attribute = 1
puts foo.my_boolean_attribute?
puts bar.my_boolean_attribute?
이 접근법을 사용하면 건조하고 멋진 질문을 얻을 수 있습니다. "보다 더 나은 이름을 선택하면"bool_attr", 처럼, "bool_attr_accessor"또는 비슷한 것.
내가 만든 정의는 물음표가 원래 기호로 존재한다는 의미에서 약간 크랭크입니다. 아마도 더 깨끗한 접근법은 기호 이름의 질문 마크를 피하고 방법의 정의 중에 그것을 추가하는 것일 것입니다. 혼란스러워해야합니다.
아, 그리고 의무적 인 링크를 포함하는 것을 거의 잊었습니다. 메타 클래스를 명확하게보고 있습니다