首页 > 解决方案 > Ruby 程序中的案例代码无法使用传递的值

问题描述

为程序编写了一些测试代码,试图传递 2 个值,一个文件和一个数字。下面的内容根本不起作用,但如果我有类似的东西puts "test" (在外壳之外)它可以工作。

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()

标签: rubyargumentscaseprocedure

解决方案


case的 s 没有按照你的想法做。对给定的表达式when进行评估,并将结果与case​​使用大小写相等运算符的值进行比较===。诸如number > 1将评估为trueor的表达式false。将此结果与 Ruby 中的整数进行比较是没有意义的。

您应该直接与常量进行比较。

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

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

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

推荐阅读