我正在尝试创建一种方法来检查三个变量a
,b
和c
是否是毕达哥拉斯三元组。我使用已知的三元组进行设置:3
,4
,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 :(得分:2)
a
,b
和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句子。
答案 1 :(得分:0)
在定义块中,即局部变量的范围,未定义a
,因此出现错误消息。
答案 2 :(得分: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
,b
和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)