Ruby程序中的大小写代码不能处理传递的值



为程序编写了一些测试代码,试图传递2个值,一个文件和一个数字。下面的代码根本不起作用,但如果我有像puts "test"这样的东西(在case之外),它就会起作用。

def read_album(music_file, number)
puts number #(this does something)
case number.to_i
when(number > 1)
puts "done"
when(number < 2)
puts "something"
when(number == 3)
puts "none of this inside case is working"
end
end
def main()
a_file = File.new("albums.txt", "r")
print("Choose album id: ")
choice_of_album = gets().to_i
read_album(a_file, choice_of_album)
end
main()

你的case没有做你想的那样。对when的表达式求值,并使用===的大小写相等运算符将结果与case的值进行比较。像number > 1这样的表达式将求值为truefalse。在Ruby中,将此结果与整数进行比较是没有意义的。

你应该直接比较这些常量

case number
when 1
# handle 1
when 2
# handle 2
when 3
# handle 3
else
# handle unknown case; error?
end

注意,其他类可能会覆盖===来提供有用的行为。例如,RangeRegexp类就是这样做的。

case number
when 1..3
# handle 1, 2 and 3
end
case string
when /pattern/
# handle pattern
end

值得注意的是,Proc类也这样做!

def greater_than(n)
proc { |x| x > n }
end
case number
when greater_than(2)
# handle number > 2
end

您需要从case语句中删除number.to_i

或者像

case number.to_i
when 1..2 
puts "foo"
when 3..100
puts "bar"
else 
puts "foobar"
end
end

来自Ruby文档

Case语句由一个可选条件组成,该条件位于Case的参数位置,以及零个或多个when子句。第一个匹配条件的when子句(如果条件为空,则计算为布尔值)"获胜",并执行其代码节。case语句的值为成功的when子句的值,如果没有成功的when子句,则为nil。

你的版本将计算为类似

的东西
if (number > 1) === number.to_i

并且由于您正在将数字与布尔表达式进行比较,因此不会计算为真。如果在case语句中有else语句,则会调用此语句。

最新更新