Когда использовать 'сам' в Ruby

Пример кода для дампа объекта и его свойств может быть найден здесь:

http://www.developer.com/net/csharp/article.php/3713886

9
задан Jim Puls 11 August 2009 в 06:47
поделиться

2 ответа

Когда бы вы ни захотели вызвать метод установки для себя, вы должны написать self.foo = bar. Если вы просто напишете foo = bar, синтаксический анализатор ruby ​​распознает это как присвоение переменной и теперь будет думать о foo как о локальной переменной. Чтобы синтаксический анализатор понял, что вы хотите вызвать метод установки, а не назначать локальную переменную, вы должны написать obj.foo = bar, поэтому, если объект является самим собой, self.foo = bar

43
ответ дан 4 December 2019 в 06:02
поделиться

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

class Foo
  attr_accessor :boo
  def do_boo
    boo = 123
    puts "Locvar: #{boo} Method: #{self.boo}"
  end
end
Foo.new.do_boo

Вот почему: представьте, что у вас есть модуль, реализующий метод. Этот метод присваивает что-то своей внутренней локальной переменной разрешение имени метода будет только в том случае, если в области нет локальной или блочной переменной с тем же именем. Вот:

class Foo
  attr_accessor :boo
  def do_boo
    boo = 123
    puts "Locvar: #{boo} Method: #{self.boo}"
  end
end
Foo.new.do_boo

Вот почему: представьте, что у вас есть модуль, реализующий метод. Этот метод присваивает что-то своей внутренней локальной переменной разрешение имени метода будет только в том случае, если в области нет локальной или блочной переменной с тем же именем. Вот:

class Foo
  attr_accessor :boo
  def do_boo
    boo = 123
    puts "Locvar: #{boo} Method: #{self.boo}"
  end
end
Foo.new.do_boo

Вот почему: представьте, что у вас есть модуль, реализующий метод. Этот метод присваивает что-то своей внутренней локальной переменной "foo", который используется для некоторых вычислений. Если вы пропустите часть «self», метод вызовет метод «foo =» для объекта. чей класс включает модуль, что не входило в намерения автора и может быть совершенно катастрофическим.

class Foo
  def bar=(new_value_of_bar)
    set_off_nukes(new_value_of_bar / 3)
  end
end

module InnocentModule # written by a different author elsewhere
  def do_useful_stuff
    ...
    bar = Math.sin(something) # we're dead
  end
end
Foo.send(:include, InnocentModule)

Еще одна важная часть, где вы должны использовать self, - это вызов метода класса Object #, потому что простое выражение «класс» означает класс ключевое слово для Ruby.

7
ответ дан 4 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

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