2014-09-25 65 views
-1

運行下面的代碼:紅寶石爲無返回undefined方法+:nilClass

# experiment 
time = 5000 
# when time reaches 10000, I'm off duty 
def speedup_time(incre) 
    time += incre 
    yield(time) 
end 

puts "is the day over yet? #{speedup_time(2000){ 
    if incre >= 10000 
    "yes: #{time}" 
    else 
    "no: #{time}" 
    end 
}}" 

我就遇到了這個錯誤:undefined method "+" for nil:nilClass

+0

Ruby應該'提高未定義的局部變量或方法'時間',但解析器將'time'變成'nil',我無法理解'def'範圍內爲什麼'time'等於'nil'? – 2014-09-25 16:26:38

+0

@Зелёный,因爲解析器看到了這個'time =',所以解析器創建一個名爲time的變量並將它標記爲局部變量。這意味着時間變量存在,但尚未分配一個值。然後代碼執行,並引發錯誤。即使分配語句不可能執行,解析器也會這樣做,例如, '如果是假的;時間= 10;結束' – 7stud 2014-09-25 16:37:29

回答

2

time變量超出範圍(Ruby中的定義方法具有自己的作用域,並且看不到任何外部變量)。試試這個:

# when time reaches 10000, I'm off duty 
def speedup_time(incre) 
    time = 5000 
    time += incre 
    yield(time) 
end 

而你的第二個表達錯誤。我想應該是這樣的:

speed_var = speedup_time(2000) do |time| 
    if time >= 10000 
    "yes: #{time}" 
    else 
    "no: #{time}" 
    end 
end 
puts "is the day over yet? #{speed_var}" 

或短三元運算符:

speed_var = speedup_time(2000) { |time| (time >= 10000) ? "yes: #{time}" : "no: #{time}" } 
puts "is the day over yet? #{speed_var}" 

或:

puts %Q|is the day over yet? #{speedup_time(2000){ |time| (time >= 10000) ? "yes: #{time}" : "no: #{time}"}}| 
+0

我在考慮使用yield並將其適應promise.then風格,因爲我習慣使用javascript,是否有一種方法可以用yield來適應這種情況。 – user2167582 2014-09-25 16:16:39

+0

@ user2167582看起來更新的答案,如果我理解的權利。 – 2014-09-25 16:18:14

+0

很酷,所以'end end'就像括號中的替代品:'{}',它們是否定義並劃分了ruby中的所有塊? – user2167582 2014-09-25 16:25:29

2

I was thinking of using the yield and adapt this to a promise.then style as I was accustomed to in javascript, is there a way to adapt this with yield.

你將要學習塊多一點因爲這也不起作用:

def do_stuff(x) 
    yield 
end 


do_stuff(10) { puts x } 


--output:-- 
2.rb:6:in `block in <main>': undefined local variable or method `x' for main:Object (NameError) 
    from 2.rb:2:in `do_stuff' 
    from 2.rb:6:in `<main>' 

很明顯,當涉及到紅寶石範圍時,你會迷失方向。獲得一個開始紅寶石書。閱讀。 Ruby不是JavaScript。

#----A def creates a new scope--+ 
def do_stuff    # | 
    x = 10     # | 
end      # | 
#-------------------------------+ 
#...which means nothing inside that box can see anything outside the box 
#except for constants, which are visible everywhere 

y = 20 

p = Proc.new do #Proc.new and lambda create anonymous functions in ruby 
    puts y 
    puts x 
    puts z 
end 

def test(p) 
    z = 30 
    p.call #execute proc, can also be written as p[] 
end 

test p 

玩弄這個例子,註釋掉各種puts語句。

+0

謝謝,在完全迷失於書本之前,我會通過一些語法和練習來磨合。 – user2167582 2014-09-25 16:32:45

+1

+1'javascript'包含瘋狂範圍規則IMO。 – 2014-09-25 16:36:59

+0

@Зелёный,是的,像循環變量是全局變量。 :( – 7stud 2014-09-25 16:40:20