Рубиновые чехлы - PullRequest
       6

Рубиновые чехлы

3 голосов
/ 23 сентября 2009

ruby ​​имеет некоторые крайние случаи, которые трудно объяснить, потому что синтаксический анализ приносит некоторые интересные проблемы. Здесь я перечисляю два из них. Если вы знаете больше, добавьте в список.

def foo
  5
end

# this one works
if (tmp = foo)
  puts tmp.to_s
end

# However if you attempt to squeeze the above
# three lines into one line then code will fail
# take a look at this one. I am naming tmp2 to 
# avoid any side effect

# Error: undefined local variable or method ‘tmp2’ for main:Object
puts tmp2.to_s if (tmp2 = foo)

Вот еще один.

def x
  4
end

def y
  x = 1 if false 
  x + 2
end

# Error: undefined method `+' for nil:NilClass
puts y

Однако, если вы закомментируете строку x = 1, если false, код будет работать нормально.

Ответы [ 2 ]

6 голосов
/ 23 сентября 2009

В вашем первом примере tmp2 не назначается, пока не достигнет оператора if.

Ваш второй пример не является неожиданным. Хотя x никогда не назначается, он сообщает интерпретатору, что вы говорите о переменной x, а не о функции x в следующей строке. Ruby старается быть довольно свободным при определении контекста имени, но при этом будет принимать подсказки там, где это возможно. Это помогает быть конкретным, например:

def y
  x = 1 if false
  x() + 2
end
6 голосов
/ 23 сентября 2009

Программные ошибки не являются крайними случаями


Хм. В первом примере вы присваиваете 5 для tmp, тем самым определяя символ tmp, а затем обнаруживаете, что class Fixnum действительно отвечает на to_s. Но в первом случае неудачи вы пытаетесь поставить точку на неопределенном символе ... это однопроходный интерпретатор ... и оператор не может быть проанализирован.

Не совсем "крайний случай", и я должен задаться вопросом, думали ли вы, что сравниваете tmp и foo.

Во втором случае вы создаете локальную переменную x, но оставляете ее nil из-за if false, а затем естественным образом обнаруживаете, что nil не имеет + метода. Если вы закомментируете строку, метод x виден и вызывается.

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

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