Ruby знает, что myvar - это переменная в myvar = 0, если false - PullRequest
1 голос
/ 12 января 2012

Я изучаю Ruby, и мне нравится играть с irb, чтобы открывать новые функции и приемы. Сегодня я играл с переменными и методами, потому что хотел знать, какой из них предпочтительнее другого. Все выглядело хорошо, пока я не попробовал это:

def test
   puts "hello"
end

test = "bye" if false

puts test

Я ожидал, что это вернется "hello", но это не так. Итак, я полагаю, что парсер обрабатывает 'test' как переменную вместо метода . У меня два вопроса:

  1. Правильно ли мое предположение?
  2. Есть ли способ узнать, является ли что-то переменной или методом? Какой-то метод, например test.is_variable?

Ответы [ 2 ]

3 голосов
/ 12 января 2012
test = "hello" if false
p test #=> nil

Локальная переменная test создается в любом случае (со значением по умолчанию nil), и, учитывая, что локальные переменные перекрывают методы с тем же именем, это значение вы получаете. Всего час назад кого-то укусила тонкая вариация темы. И разве вы не думаете, что это происходит только с однострочными условиями:

if false
  test = "hello" 
end
p test #=> nil

Это потому, что Ruby определяет переменные, когда они анализируются (а не когда они выполняются).

0 голосов
/ 12 января 2012

Есть как минимум два метода, которые помогают: methods и local_variables.Я бы не рекомендовал использовать их в реальных программах, но они могут быть полезны при изучении Ruby.

...