1

我正在尝试创建一种方法来检查三个变量a,bc是否是毕达哥拉斯三元组。我用一个已知的三元组设置它: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)

任何帮助都感激不尽。

4

3 回答 3

2

a, b, 和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)

这将在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创建一个函数。在功能块内部,您有一个范围。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)
于 2013-08-28T00:15:42.700 回答