2012-12-19 10 views
20

Rubyには、インスタンス変数のゲッターとセッターのメソッドが4種類あり、attr,attr_reader,attr_writerattr_accessorです。問題は、Ruby attr :dilithiumにあり、attr_reader :dilithiumと同じで、追加のパラメータtrueが渡された場合はattr_accessor :dilithiumと同じですか?つまりattr対attr_accessor

class Enterprise 
    attr_accessor :dilithium 

と同じ

class Enterprise 
    attr :dilithium, true 

は2つの機能attr多かれ少なかれ冗長attr_accessorていますか?

答えて

27

1つの違いはattr_accessorと友だちがより明確であり、attrへのオプションのブール値引数が廃止されました。それ以外にも、attrにはドキュメントがないという事実は、実際の違いはありません。

+2

'attr'には少なくとも2.3.0のドキュメントがあります。 'attr_reader'のエイリアスです。しかし、ドキュメンテーションの編成方法はかなり貧弱ですが、物事をより明確にするために改善することができます。 – ioquatix

6

Ruby 1.8では、attrは1つの属性のみを定義でき、オプションでtrueを設定してセッターを作成できます。 1.9では、attr_readerのように振る舞います:複数の属性が可能です。 @Linuxiosによれば、オプションのブール値は非推奨です。

1

Ruby 2.3.0でCコードを見ると、実際には(推奨されていないコードパスを除いて)attrattr_readerが同じことをしていることがわかります。それらは本質的に同等の機能です。私にとって

、主な相違点は以下のとおりです。

attrはそれが短いだとして書き留めて少し簡単です。私は機能/不変プログラミングの文脈で感じる方法が好きです(これらの文脈では、attr_writerattr_accessorは無関係であり、attr_readerを使用すると冗長で冗長です)。

attr複数のインスタンス変数を使用すると、特定の状況(例:

# The coordinates in WGS84. 
attr :x, :y 

# The location name. 
attr :name 

# The popularity of the location. 
attr :popularity 

、彼らが同じ行attr :name, :popularityにあった場合、独立して:name:popularityを文書化するのは難しいだろう。

それ以外は個人的な好みになっています。実際には、パフォーマンスの差やその他の違いはありません。