为程序编写了一些测试代码,试图传递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
这样的表达式将求值为true
或false
。在Ruby中,将此结果与整数进行比较是没有意义的。
你应该直接比较这些常量
case number
when 1
# handle 1
when 2
# handle 2
when 3
# handle 3
else
# handle unknown case; error?
end
注意,其他类可能会覆盖===
来提供有用的行为。例如,Range
和Regexp
类就是这样做的。
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语句,则会调用此语句。