В Ruby не совпадает ли self.user_name с @user_name? - PullRequest
3 голосов
/ 22 октября 2010

В Ruby не переменная экземпляра, такая как @foo и переменная класса, @@bar?

В некотором коде я вижу несколько

self.user_name = @name

или даже

a += 1 if name != user_name   # this time, without the "self."
                              # and it is the first line of a method so 
                              # it doesn't look like it is a local variable

для чего нужна личность?Я думал, что это может быть аксессор, но не может ли это быть просто user_name вместо self.user_name?И я даже не вижу никакого кода, который бы сделал его средством доступа, например attr_accessor, и не в базовом классе.

Ответы [ 3 ]

4 голосов
/ 22 октября 2010

в рубине:

  • @foo является переменной экземпляра
  • @@bar является переменной класса

Переменные экземпляра и класса по умолчанию являются закрытыми. Это означает, что вы не можете установить или получить значение вне класса или самого модуля.

Если вы хотите установить значение для foo, вам нужен атрибут доступа.

class Model
  def foo
    @foo
  end

  def foo=(value)
    @foo = value
  end
end

Для удобства (и для повышения производительности) это то же самое, что и

class Model
  attr_accessor :foo
end

Тогда вы можете сделать

m = Model.new
m.foo = "value"

А в классе можно доу

class Model

  # ...

  def something
    self.foo = "value"
    # equivalent to
    @foo = value
  end

end
1 голос
/ 22 октября 2010

для чего я?Я думал, что это может быть аксессор

По крайней мере, это метод - вероятно, аксессор.self.name = something вызовет метод name= и self.name, или, если не существует локальной переменной с именем name, просто name вызовет метод name.

, но затем можетразве это не просто имя_пользователя вместо self.user_name?

При вызове метода name= необходим self, поскольку name = something просто создаст локальную переменную с именем name.При вызове метода name не имеет значения, пишете ли вы name или self.name, если только не существует локальной переменной с именем name.

И я даже несм. любой код, делающий его средством доступа, например attr_accessor, но не в базовом классе.

Если нет вызова attr_accessor и нет явного определения name и name=в любом месте они могут обрабатываться method_missing или определяться другим методом, отличным от attr_accessor.

не совпадает с self.user_name как @ user_name

Только если это определено.Если вы определите user_name и user_name=? using attr_accessor they will get and set @ user_name`.Однако если вы определяете их с помощью других средств (или вручную), они могут делать все, что вы захотите.

Например, ActiveRecord использует method_missing для «определения» методов получения и установки, которые соответствуют столбцам базы данных.Поэтому, если ваш класс ActiveRecord принадлежит таблице со столбцом user_name, вы будете иметь методы user_name и user_name=, не определяя их где-либо.Значения, возвращаемые user_name и установленные user_name =, также не будут соответствовать переменным экземпляра.Т.е. не будет никакой переменной экземпляра с именем @user_name.

Другой способ автоматического определения user_name и user_name= без использования переменных экземпляра - Struct:

MyClass = Struct.new(:user_name)

Здесь MyClass будет иметь методы user_name и user_name=, но никакая переменная экземпляра @user_name не будет установлена ​​ни в одной точке.

0 голосов
/ 22 октября 2010

Добро пожаловать в адский «охват»!

Конечно, если у нас есть полный код, вам будет проще объяснить, что вы видите.

class Woot
  attr_accessor :name

  def initialize
    self.name = 'Bistromathic Drive'
  end

  def foo
    puts name # hum… I don't know name. An attr? Oh Yes!
    name = '42' # New local var named 'name'
    puts name # Yeah! I know a local named 'name'
    puts self.name # I know the attr named 'name'
    name = 'Improbability Drive' # Change the local
    puts name 
    puts self.name # attr didn't move
    self.name = 'What was the question?'
    puts name
    puts self.name
  end
end
w = Woot.new
w.foo
# => Bistromathic Drive
42
Bistromathic Drive
Improbability Drive
Bistromathic Drive
Improbability Drive
What was the question?

Частичный код, который вы показываете, является «подозрительным» для меня, и я бы предпочел объяснить основание var scope.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...