質問

学習rubyなどがある。私の印象でboolean属性名は以下の

my_boolean_attribute?

しかし、構文エラーとなっしなければならない。

class MyClass
  attr_accessor :my_boolean_attribute?

  def initialize
    :my_boolean_attribute? = false
  end
end

どうやらrubyのが嫌に"?".この条約の?なぜですか?

役に立ちましたか?

解決

編集:三年後に;のは、-changin'...

Julikの回答 は最もシンプルで、一番の問題に取り組むこれらの日

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

また、問題-マーク接尾辞が多くばコンベンションを表示するために、返り値はメソッドはboolean.

最近似できそうですがどのようにいためこちら---

class MyClass

  def initialize
    @awesome = true
  end

  def awesome?
    @awesome
  end

end

この場合、場合もございますの作用 attr_accessor —後、できるだけ直接boolean属性。一般的に、保存の問題-マーク接尾辞が私の実施を持つメソッドはboolean型の戻り値は少し複雑な条件だけの価値の属性。

感謝!


編集は、年を経て、最近のコメント:

  1. Rubyの実施を行う一定のネーミングコンベンションに出かけていく。 シンボルをRubyできない。このメソッドの呼び出し :my_boolean_attribute? 両方の失敗と 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なので、それはあなたが(記号ではない)に設定されなければならないものだということを意味します。

また、あなたが使用することはできませんか?変数のため、ちょうどメソッド名。

? methodnames、いない変数のための規則です。あなたがしたい場合しかし、あなたは@foo?という名前の変数を使用し、(手動で作成)ゲッターメソッド@fooに名前を付けることができ、foo?という名前のインスタンス変数を使用することはできません。

モンキー・パッチ適用メタプログラミング - 多分これが唯一の迅速なドラフトで、よりエレガントにすることができ、私はしばらくの間、メタプログラミングを行っていない...

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

このアプローチを使用すると、乾燥して、あまりにも素敵なquestionmarkを得ることができます。あなただけの "のbool_attr の" より良い名前を選択する必要があるかもしれません、のような "のbool_attr_accessor の" か何か似ています。

私が作った

の定義は、疑問符が元のシンボルに存在するという意味で、ビット不機嫌です。おそらくクリーナーアプローチは、シンボル名にquestionmarkを回避し、メソッドの定義中にそれを追加することです - あまり混乱する必要があります。

ああ、ほとんど義務リンク含めるのを忘れて:はっきり見メタクラスする

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top