2013-08-28 60 views
1

我試圖創建一個方法來檢查三個變量a,bc是否是一個畢達哥拉斯三元組。我用一個已知的三元組進行設置:34,5。這個程序不會運行,我不明白爲什麼。如何使用變量創建算術語句?

a = 3 
b = 4 
c = 5 

def triplet? 
    if a**2 + b ** 2 == c ** 2 
    puts 'pythagorean triplet' 
     else puts 'not a pythagorean triplet' 
    end 
end 

triplet? 

它返回的錯誤信息:

undefined local variable or method `a' for main:Object (NameError) 

任何幫助將非常感激。

回答

0

在定義塊中,這是局部變量的作用域,因此沒有定義a,因此是錯誤消息。

0
a = 3 
b = 4 
c = 5 

def triplet?(a, b, c) 
    if a**2 + b ** 2 == c ** 2 
     puts 'pythagorean triplet' 
    else 
     puts 'not a pythagorean triplet' 
    end 
end 

triplet?(a, b, c) 

def創建函數。在功能塊內部,您有一個範圍。 a,bc不在該範圍內。告訴函數參數a, b, c並傳遞參數。

在給出函數參數的名稱和傳遞的函數參數之間沒有關係。

以下也將工作:

x = 3 
y = 4 
z = 5 

def triplet?(a, b, c) 
    if a**2 + b ** 2 == c ** 2 
     puts 'pythagorean triplet' 
    else 
     puts 'not a pythagorean triplet' 
    end 
end 

triplet?(x, y, z) 
2

ab,和c是本地到,它們會在所限定的範圍,因此將不單獨範圍可見(如其他方法)。見the doc on Object#def

開始一個新的本地作用域;輸入def塊時存在的局部變量不在塊的範圍內,並且塊中創建的局部變量不會超出塊。

你想要做什麼是通號作爲參數:

def triplet?(a, b, c) 
    if a**2 + b ** 2 == c ** 2 
    puts 'pythagorean triplet' 
    else puts 'not a pythagorean triplet' 
    end 
end 

triplet?(3, 4, 5) 

這將通過使它們,當你調用定義在triplet?方法的範圍這三個變量,那麼您填充他們的價值觀方法。

在Ruby conventionally return a boolean中,有一點需要注意,按照慣例,謂詞方法(即以?結尾的方法)。爲了慣用寫這個方法,你可能會說:

def triplet?(a, b, c) 
    a**2 + b ** 2 == c ** 2 
end 

if triplet?(3, 4, 5) 
    puts 'pythagorean triplet' 
else 
    puts 'not a pythagorean triplet' 
end 

這樣,triplet?總是會返回一個true或false,那麼你可以使用它在你的代碼寫英語-Y句子。

+0

+1感謝您評論謂詞方法。 – Borodin