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

How to bypass scope convention in ruby if else statements

这显示了一个错误,因为 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' 对于 main:Object 来自 :7 来自 C;/Ruby200-x64/bin/irb:12;在 ''

使用 interpolation 摆脱它。

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

您试图连接 String 对象与Float 对象。这是不可能的,因此您必须在 concatenation.

之前将那些 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]$

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

`+': no implicit conversion of Float into String (TypeError)

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

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

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

或使用interpolation(更可取):

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