这显示错误,因为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;在''
答案 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)
完全不同,与变量可见范围无关。错误的说法是您无法总结String
和Float
(在控制台中尝试'a' + 1.0
)。
要修复它,您应该自己将变量转换为字符串:
puts "(x,y) = (" + x.to_s + "," + y.to_s + ")"
或使用interpolation(最好):
puts "(x,y) = (#{x}, #{y})"