web-dev-qa-db-ja.com

Rubyのメソッドと属性の違いは何ですか?

例を挙げていただけますか?

21
collimarco

属性は、オブジェクトの特定のプロパティです。メソッドはオブジェクトの機能です。

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_accessorattr_writerおよびattr_reader

31
Simone Carletti

属性は単なるショートカットです。 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"
40
Rafe

属性は、厳密に言えば、クラスインスタンスのインスタンス変数です。より一般的に言えば、属性は通常、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などの属性の値に基づいてデータを提供するユーティリティメソッドとの違いが小さい場合がよくあります。

4
tadman
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インスタンス変数に対して明示的に定義されたセッターです。

1
Aaron Rustad

「属性」という言葉は、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が属性になります。

0
Luke Griffiths