Каково различие между Методами и Атрибутами в Ruby?

Чтобы никогда не забывать максимальное значение любого типа:

Если оно имеет 32 бита, наибольшим возможным значением будут 32 бита с номером 1:

enter image description here

Результат будет 4294967295 в десятичном виде:

enter image description here

Но, как есть также представление отрицательных чисел, разделите 4294967295 на 2 и получите 2147483647.

Следовательно, 32-разрядное целое число может представлять от -2147483647 до 2147483647.

21
задан collimarco 28 July 2009 в 14:42
поделиться

4 ответа

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

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

31
ответ дан 29 November 2019 в 06:19
поделиться

Атрибуты - это просто ярлык. Если вы используете attr_accessor для создания атрибута, Ruby просто объявляет переменную экземпляра и создает для вас методы получения и установки.

Поскольку вы просили привести пример:

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
ответ дан 29 November 2019 в 06:19
поделиться

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

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

4
ответ дан 29 November 2019 в 06:19
поделиться
class MyClass
  attr_accessor :point

  def circle
    return @circle
  end

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

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

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

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

1
ответ дан 29 November 2019 в 06:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: