Ruby - Как не переписать переменные экземпляра в методах? - PullRequest
0 голосов
/ 21 января 2011

Скажем, что у нас есть этот класс:

class Hello
  def hello
    @hello
  end

  def hello=(hello)
    @hello = hello
  end

  def other_method
    hello = 'hi!'
    ...
  end
end

В этом случае

h = Hello.new
h.other_method
puts h.hello

напишет "привет!" Из-за интерпретации hello = как self.hello =.Есть ли способ избежать такого поведения, предоставив объявлению hello = локальную область метода (как, например, var hello = будет делать с кодом JavaScript)?

EDIT Извините, я был уверен, что у меня возникла проблема по этой причине!Но теперь у меня есть еще два вопроса!

  1. почему hello = не интерпретируется как self.hello = ???он объявлен как метод экземпляра ...

  2. почему, даже если я напишу

<code>...
  def other_method
    self.hello = 'hi!'
  end
end
h = Hello.new
h.other_method
puts h.hello
, он возвращает nil ???теперь это должно быть явное задание!

Спасибо за терпение, я немного растерялся!: - /

Ответы [ 2 ]

2 голосов
/ 21 января 2011

На самом деле это будет не печать привет!потому что hello = 'hi!' в other_method присваивается локальной переменной и не интерпретируется как self.hello=.

Если это не то поведение, которое вы видите, то должно быть что-то еще, специфичное для вашего кодаВы не включили в вопрос.


Ответы на последующие вопросы:

  1. В теле метода identifier = value присваивает локальную переменную (без методапоиск выполняется (поэтому не имеет значения, что существует метод hello=. Вам нужен явный self., чтобы вызвать метод.
  2. Когда вы пишете puts h.hello, он печатает 'hi!', которыйвозвращаемое значение h.hello, но затем возвращает nil, которое является возвращаемым значением puts.
0 голосов
/ 21 января 2011

у меня работает:

$ irb
irb(main):001:0> class Hello
irb(main):002:1> def hello
irb(main):003:2>   @hello
irb(main):004:2> end
irb(main):005:1> def hello=(hello)
irb(main):006:2>   @hello = hello
irb(main):007:2> end
irb(main):008:1> def other_method
irb(main):009:2>   self.hello = 'hi!'
irb(main):010:2> end
irb(main):011:1> end
=> nil
irb(main):012:0> h = Hello.new
=> #<Hello:0xb746b7cc>
irb(main):013:0> h.other_method
=> "hi!"
irb(main):014:0> puts h.hello
hi!
=> nil
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...