如何使用变量创建算术语句?

时间:2013-08-28 00:13:40

标签: ruby methods

我正在尝试创建一种方法来检查三个变量abc是否是毕达哥拉斯三元组。我使用已知的三元组进行设置:345。这个程序不会运行,我无法弄清楚原因。

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)

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

abc是他们定义的范围的本地,因此对于单独的范围(例如其他方法)不可见。见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创建一个函数。在功能块内部,您有一个范围。 abc不在此范围内。告诉函数取参数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)