如何绕过ruby if else语句中的范围约定

时间:2015-03-03 14:18:44

标签: ruby if-statement scope

这显示错误,因为ruby作用域规则阻止我访问if else块中的外部变量。

puts "Enter Line 1 m and c:"
m1 = gets.to_f
c1 = gets.to_f

puts "Enter Line 2 m and c:"
m2 = gets.to_f
c2 = gets.to_f

if ((m1==m2) and (c1==c2))
  puts "infinite solutions"
elsif ((m1==m2) and (c1!=c2))
  puts "no solution"
else
  x = (c1 - c2)/(m2 - m1)
  y = m1*x + c1
  puts "(x,y) = (" + x + "," + y+")"
end 

你能告诉我一种解决这个错误的方法吗?

更新:

实际上我得到的错误是: 未定义的局部变量或方法' c1' for main:对象来自:7 来自C; / Ruby200-x64 / bin / irb:12;在''

2 个答案:

答案 0 :(得分:2)

使用interpolation来摆脱这种情况。

puts "(x,y) = (#{x}, #{y})" 

您试图 String对象与Float对象连接起来。这是不可能的,因此您必须在连接之前将这些Float转换为String个对象。

修改后的代码:

puts "Enter Line 1 m and c:"
m1 = gets.to_f
c1 = gets.to_f

puts "Enter Line 2 m and c:"
m2 = gets.to_f
c2 = gets.to_f

if m1 == m2 and c1 == c2
  puts "infinite solutions"
elsif m1 == m2 and c1 != c2
  puts "no solution"
else
  x = (c1 - c2)/(m2 - m1)
  y = m1*x + c1
  puts "(x,y) = (#{x}, #{y})"
end

<强>输出

[arup@Ruby]$ ruby a.rb
Enter Line 1 m and c:
14
21
Enter Line 2 m and c:
12
44
(x,y) = (11.5, 182.0)
[arup@Ruby]$

答案 1 :(得分:1)

它不会阻止您访问外部变量,您看到的错误是:

  

`+&#39;:没有将Float隐式转换为String(TypeError)

完全不同,与变量可见范围无关。错误的说法是您无法总结StringFloat(在控制台中尝试'a' + 1.0)。

要修复它,您应该自己将变量转换为字符串:

puts "(x,y) = (" + x.to_s + "," + y.to_s + ")"

或使用interpolation(最好):

puts "(x,y) = (#{x}, #{y})"