Вызов переменной экземпляра в виртуальном атрибуте с помощью Ruby - PullRequest
0 голосов
/ 31 января 2011

Так что я только начинаю пробираться через Прагматическую Книжную Книгу, " Программирование на Ruby 1.9 (3-е издание) ", и я наткнулся на некоторый код, который мне нужно немного пояснить.

Если вы владеете книгой, она находится в главе 3 «Классы, объекты и переменные», в частности в разделе о виртуальных атрибутах.

По сути, класс определяется с помощью инициализатора, который устанавливаетпара переменных экземпляра, одна из которых @price.Эта переменная имеет метод доступа / мутатор, созданный с помощью attr_accessor, например:

attr_accessor :price

У этого класса также есть виртуальный атрибут с именем price_in_cents, который просто возвращает значение из этой строки:

Integer(price*100 + 0.5)

Теперь мой вопрос: почему price в виртуальном атрибуте не имеет префикса @?Он явно имеет дело с переменной экземпляра.Выполнение кода без @ работает так же, как и с;почему это так?

PS Извините, что не просто выкладываю код оптом - учитывая, что это вопрос о коде в книге, я не был уверен, какое юридическое право я буду публиковать.

Ответы [ 3 ]

3 голосов
/ 31 января 2011

Это отправленное сообщение без получателя.

В Ruby получатель self неявный: вы можете оставить его, если хотите. Таким образом, price в основном совпадает с self.price (игнорируя ограничения доступа).

Другими словами, он вызывает метод price, который вы определили с помощью attr_accessor.

0 голосов
/ 12 июля 2014

Этот вопрос был опубликован несколько лет назад, но на тот случай, если кто-нибудь столкнется с подобными проблемами, как пример сверху.

Я не думаю, что self.price имеет какое-либо отношение к attr_accessor, только self.priceприменяется к классу, где attr_accessor становится ярлыком для переменной экземпляра.Вам не нужно вводить '@' перед attr_accessor, потому что он действует как ярлык для ваших установщиков и получателей, если вы знакомы с Java.Часть легкомысленного способа Руби сделать вещи быстрее и более красноречиво.

0 голосов
/ 31 января 2011

Вы можете легко подтвердить, что две ссылки (price и @price) указывают на одни и те же объекты:

#!/usr/bin/env ruby

class MyPrice < Object
  attr_accessor :price

  def initialize(price = 0)
    @price = price
  end

  def price_in_cents
    Integer(price * 100 + 0.5)
  end

  def objects
    puts "@price.object_id: #{@price.object_id}"
    puts "price.object_id:  #{price.object_id}"
  end
end

p = MyPrice.new(150)
p.objects
puts "price in cents: #{p.price_in_cents}"

Который производит:

# ./price.rb 
@price.object_id: 301
price.object_id:  301
price in cents: 15000

Тот факт, что price и @price оба имеют идентификатор объекта 301, показывает, что они оба являются ссылками на один объект.

...