Можете ли вы привести мне пример?
В чем разница между методами и атрибутами в Ruby?
Ответ 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 будет атрибутом.