1

3 つの変数がピタゴラスのトリプレットaであるかどうかを確認するメソッドを作成しようとしています。私は既知のトリプレットでそれを設定しました: , , . このプログラムは実行されませんが、その理由がわかりません。bc345

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)

どんな助けでも大歓迎です。

4

3 に答える 3

2

ab、およびcは、それらが定義されているスコープに対してローカルであるため、別のスコープ (他のメソッドなど) からは見えません。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)

これにより、メソッドのスコープでこれら 3 つの変数が定義され、triplet?メソッドを呼び出すときにそれらを渡して値を入力します。

?ちょっとした注意点として、慣例により、Rubyの述語メソッド (つまり、 で終わるメソッド) は、慣習的に 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 を返すので、コードでそれを使用して英語っぽい文を書くことができます。

于 2013-08-28T00:16:10.423 に答える
0

ローカル変数のスコープである定義ブロック内で定義aされていないため、エラーメッセージが表示されます。

于 2013-08-28T00:15:32.717 に答える
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関数を作成します。関数ブロック内には、スコープがあります。ab、およびcはその範囲にありません。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)
于 2013-08-28T00:15:42.700 に答える