Подтвердить что ты не робот

В чем разница между методами и атрибутами в Ruby?

Можете ли вы привести мне пример?

4b9b3361

Ответ 1

Атрибуты - это конкретные свойства объекта. Методы - это возможности объекта.

В 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"

Поскольку это действительно поведение commmon, Ruby предоставляет удобный метод для определения методов доступа: attr_accessor, attr_writer и attr_reader.

Ответ 2

Атрибуты - это просто ярлык. Если вы используете 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"

Ответ 3

Атрибуты - это, строго говоря, переменные экземпляра экземпляра класса. В более общих терминах атрибуты обычно объявляются с использованием методов типа 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, поскольку прямой доступ к ним специально не предоставляется. Это довольно сильно контрастирует с другими языками, такими как C, или С++ и Java, где доступ к свойствам объектов и вызывающим методам осуществляется с помощью двух разных механизмов. Java, в частности, имеет методы accessor/mutator, которые описаны как таковые, тогда как в Ruby они подразумеваются по имени.

Часто бывает так, как в примере, где разница между "атрибутом доступа" и утилитом, который предоставляет данные на основе значения атрибута, такого как truncated_name, является незначительным.

Ответ 4

class MyClass
  attr_accessor :point

  def circle
    return @circle
  end

  def circle=(c)
    @circle = c
  end
end

Атрибут является свойством объекта. В этом случае я использую метод класса attr_accessor для определения свойства: point вместе с неявными методами getter и setter для точки.

obj = MyClass.new
obj.point = 3
puts obj.point
> 3

Метод 'circle' - это явно определенный getter для переменной экземпляра @circle. 'circle =' - явно заданный параметр для переменной экземпляра @circle.

Ответ 5

Я слышал, что слово "атрибут" ссылается в определенных в 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 будет атрибутом.