例を挙げていただけますか?
属性は、オブジェクトの特定のプロパティです。メソッドはオブジェクトの機能です。
In Rubyすべてのインスタンス変数(属性)はデフォルトでプライベートです。つまり、インスタンス自体のスコープ外でそれらにアクセスすることはできません。属性にアクセスする唯一の方法は、アクセサメソッド。
class Foo
def initialize(color)
@color = color
end
end
class Bar
def initialize(color)
@color = color
end
def color
@color
end
end
class Baz
def initialize(color)
@color = color
end
def color
@color
end
def color=(value)
@color = value
end
end
f = Foo.new("red")
f.color # NoMethodError: undefined method ‘color’
b = Bar.new("red")
b.color # => "red"
b.color = "yellow" # NoMethodError: undefined method `color='
z = Baz.new("red")
z.color # => "red"
z.color = "yellow"
z.color # => "yellow"
これは本当に一般的な動作であるため、Rubyはアクセサメソッドを定義するための便利なメソッドを提供します:attr_accessor
、attr_writer
およびattr_reader
。
属性は単なるショートカットです。 attr_accessor
を使用して属性を作成する場合、Rubyはインスタンス変数を宣言し、getterメソッドとsetterメソッドを作成します。
あなたが例を求めたので:
class Thing
attr_accessor :my_property
attr_reader :my_readable_property
attr_writer :my_writable_property
def do_stuff
# does stuff
end
end
クラスの使用方法は次のとおりです。
# Instantiate
thing = Thing.new
# Call the method do_stuff
thing.do_stuff
# You can read or write my_property
thing.my_property = "Whatever"
puts thing.my_property
# We only have a readable accessor for my_readable_property
puts thing.my_readable_property
# And my_writable_propety has only the writable accessor
thing.my_writable_property = "Whatever"
属性は、厳密に言えば、クラスインスタンスのインスタンス変数です。より一般的に言えば、属性は通常、attr_Xタイプのメソッドを使用して宣言されますが、メソッドは単純にそのまま宣言されます。
簡単な例は次のとおりです。
attr_accessor :name
attr_reader :access_level
# Method
def truncate_name!
@name = truncated_name
end
# Accessor-like method
def truncated_name
@name and @name[0,14]
end
# Mutator-like method
def access_level=(value)
@access_level = value && value.to_sym
end
Rubyでは、これら2つへの直接アクセスが特に提供されていないため、これら2つの区別はやや恣意的です。これは、C、C++、Javaなど、オブジェクトのプロパティへのアクセスとメソッドの呼び出しが2つの異なるメカニズムを介して行われる他の言語とは非常に対照的です。特にJavaには、そのように綴られたアクセサ/ミューテータメソッドがありますが、Rubyではこれらは名前で暗示されています。
例のように、「属性アクセサー」と、truncated_nameなどの属性の値に基づいてデータを提供するユーティリティメソッドとの違いが小さい場合がよくあります。
class MyClass
attr_accessor :point
def circle
return @circle
end
def circle=(c)
@circle = c
end
end
属性はオブジェクトのプロパティです。この場合、attr_accessorクラスメソッドを使用して、pointの暗黙的なgetterメソッドとsetterメソッドとともに:pointプロパティを定義します。
obj = MyClass.new
obj.point = 3
puts obj.point
> 3
メソッド 'circle'は、@ circleインスタンス変数に対して明示的に定義されたゲッターです。 'circle ='は、@ circleインスタンス変数に対して明示的に定義されたセッターです。
「属性」という言葉は、Ruby固有のサークルでは、引数をとらないメソッドを指していると聞きました。
class Batman
def favorite_ice_cream
[
'neopolitan',
'chunky monkey',
'chocolate',
'chocolate chip cookie dough',
'whiskey'
].shuffle[0]
end
end
上記では、my_newest_batman.favorite_ice_creamが属性になります。