2015-07-22 2 views
0

Я получил этот код в определенном классе, и BTW это обычный рубиновый с тестом/блоком, не Rails не участвует:рубин NameError определено локальные переменный или метод `г» для

10 %w[["y",true],["n",false]].each do |r, state| 
11 def must_continue_to_ask_for_input_until_given_yes_or_no 
12 
13  provide_input(r) 
14 
15  assert_equal state, @questioner.ask(@question) 
16 end 
17 end 

на запустив его ! с рубином% из ВЬЕТ редактора, я получаю эту ошибку:

Line 13, NameError: undefined local variable or method `r' for #<QuestionerTest:0x007fe931981fd0> 

QuestionerTest это мой класс и его производный от

Class QuestionerTest <Test::Unit::TestCase 

Окружающая среда:

Ruby 2.2.1 on MACOSX Mavericks 
No rails involved 
test/unit involved 

ответ

0

Это происходит потому, что, когда вы определяете метод, как это, вы перекрывая каждый раз, и каждый раз, когда она будет определена тем же. Это связано с тем, что «метод def» похож на замедленное выполнение - когда он называется рубиновым методом, он не будет «видеть» r и состояние как находящееся в области видимости.

Кроме того, «% вес» конструкция ожидает ряд строк, которые должны быть преобразованы в массив, так что, возможно, не делать то, что вы думаете:

%w[one two three] == ["one", "two", "three"] 

%w[["y",true],["n",false]].first 
    => "[\"y\",true],[\"n\",false]" 

%w[["y",true],["n",false]].first.class 
    => String 

Если вы хотите создать несколько методов во время записи окружающий ВАР, вы можете сделать что-то вроде этого:

irb(main):043:0> [1,2,3].each do |r| 
irb(main):044:1* define_method(:"foo#{r}") { |a| puts a, r } 
irb(main):045:1> end 
=> [1, 2, 3] 

irb(main):046:0> foo1("hi") 
hi 
1 
=> nil 

irb(main):047:0> foo2("bye") 
bye 
2 
=> nil 
+0

Спасибо v-much. Я решаю это. – geekjimbo

0

Прежде всего, я хочу поблагодарить adzdavies за то время отвечая на мой глупый вопрос. Теперь на основе его ответа на этот код, который я написал, чтобы исправить это:

def must_continue_to_ask_for_input_until_given_yes_or_no 
[["y",true],["n",false]].each do |r, state| 
    %w[Note Yesterday axyesq].each do |mu| 
    expect_output @question 
    provide_input(mu) 
    expect_output("I don't understand") 
    end 
    expect_output @question 
    provide_input(r) 

    assert_equal state, @questioner.ask(@question) 
end 

конец

Еще раз спасибо и давайте рубин!

 Смежные вопросы

  • Нет связанных вопросов^_^