33

ルビーを学ぶ。ブール属性には次のような名前を付ける必要があるという印象を受けています。

my_boolean_attribute?

ただし、次のことを実行しようとすると構文エラーが発生します。

class MyClass
  attr_accessor :my_boolean_attribute?

  def initialize
    :my_boolean_attribute? = false
  end
end

どうやらルビーは「?」を嫌っています。これは慣習ですか?私は何が間違っているのですか?

4

6 に答える 6

46
于 2009-08-11T22:09:53.383 に答える
43

「質問メソッド」をすばやく追加する最も簡単な方法は、リーダーメソッドにエイリアシングを使用することです。

class Foo
  attr_accessor :dead
  alias_method :dead?, :dead # will pick up the reader method
end 
于 2009-08-13T02:59:25.093 に答える
6

シンボルはattr_accessor、変数名が@my_boolean_attributeであることを意味するため、これを設定する必要があります(シンボルではありません)。

また、使用できませんか?変数の場合は、メソッド名だけです。

于 2009-08-11T22:05:09.883 に答える
5

?はメソッド名の規則であり、変数ではありません。、という名前のインスタンス変数を使用することはできませんが、必要に応じて、(手動で作成された)getterメソッドという名前の@foo?変数を使用して名前を付けることができます。@foofoo?

于 2009-08-11T22:01:28.423 に答える
3

モンキーパッチのメタプログラミング-もっとエレガントにすることができるかもしれませんが、これは簡単なドラフトにすぎません。しばらくの間、メタプログラミングを行っていません...

 # 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?

このアプローチを使用すると、DRYになり、素敵な疑問符を取得することもできます。「 bool_attr_accessor」など、「bool_attr 」よりも適切な名前を選択する必要がある場合があります。

私が作成した定義は、元のシンボルに疑問符が含まれているという意味で、少し不機嫌です。おそらく、よりクリーンなアプローチは、シンボル名の疑問符を避け、メソッドの定義中にそれを追加することです-混乱を少なくする必要があります。

ああ、そして義務的なリンクを含めるのをほとんど忘れていました:メタクラスをはっきりと見る

于 2009-08-11T22:20:49.710 に答える
0

答えを調べたところ、受け入れられた答えは的を射ているものの、クラスに「余分な」ノイズが発生しました。この問題を解決することをお勧めする方法は次のとおりです。

class Animal
  attr_writer :can_swim
  def initialize(animal_type_name)
    @can_swim = true
    @animal_type_name = animal_type_name
  end


  def can_swim?
    @can_swim
  end

  def to_s
    @animal_type_name
  end
end

dog = Animal.new('Dog in a bag')
dog.can_swim = false
puts "Can this #{dog} Swim? --- [#{dog_without_legs.can_swim? ? 'YEP!' : 'NOPE!'}]"
于 2020-01-08T17:44:28.220 に答える