문제

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 년 후, 최근의 의견 후 편집 :

  1. 루비는 특정 명명 규칙을 시행합니다. 루비의 기호는 물음표를 가질 수 없습니다. 따라서의 호출 :my_boolean_attribute? 둘 다 a NameError. 편집 : 정확하지 않음, 인용 된 구문을 기호에 사용하십시오 (예 : :"my_attribute?"
  2. 기호는 불변이지만, 하나에 할당하려고 시도하면 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"또는 비슷한 것.

내가 만든 정의는 물음표가 원래 기호로 존재한다는 의미에서 약간 크랭크입니다. 아마도 더 깨끗한 접근법은 기호 이름의 질문 마크를 피하고 방법의 정의 중에 그것을 추가하는 것일 것입니다. 혼란스러워해야합니다.

아, 그리고 의무적 인 링크를 포함하는 것을 거의 잊었습니다. 메타 클래스를 명확하게보고 있습니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top