Ruby 具有真值的Case语句

Ruby 具有真值的Case语句,ruby,typeerror,Ruby,Typeerror,两个类似的脚本在这里显示出非常奇怪的行为 A) 下面的代码正在抛出一个nil不能强制为Fixnum(TypeError): 我希望两个脚本都能在控制台上输出10。我错了吗?为什么?当给定一个参数时,case语句检查对象相等性(与调用==相同),该相等性可用于单个值或范围。在您的情况下,您并没有真正检查平等性,但可以这样写: score += case when amount >= 3 then 10 when amount < 3 then 1

两个类似的脚本在这里显示出非常奇怪的行为

A) 下面的代码正在抛出一个
nil不能强制为Fixnum(TypeError)


我希望两个脚本都能在控制台上输出
10
。我错了吗?为什么?

当给定一个参数时,case语句检查对象相等性(与调用
==
相同),该相等性可用于单个值或范围。在您的情况下,您并没有真正检查平等性,但可以这样写:

score += case
         when amount >= 3 then 10
         when amount < 3 then 1
         end

当给定一个参数时,case语句将检查对象的相等性(与调用
===
)相同,该相等性可用于单个值或范围。在您的情况下,您并没有真正检查平等性,但可以这样写:

score += case
         when amount >= 3 then 10
         when amount < 3 then 1
         end

你应该用“then”而不是“;”在case内部,不要声明case的amount变量,只需使用那里的子句即可。 使用三元运算更容易获得您想要的结果:

score += ammount >= 3 ? 10 : 1

你应该用“then”而不是“;”在case内部,不要声明case的amount变量,只需使用那里的子句即可。 使用三元运算更容易获得您想要的结果:

score += ammount >= 3 ? 10 : 1

您混合了两种类型的案例陈述:

score += amount >= 3 ? 10 : 1
  • 问题:

    为什么你的代码不起作用

    回答:

    当您在
    案例中指定变量时
    ,当测试时,将对每个
    应用隐式
    =
    操作。在您的情况下,
    amount
    是4,它大于3,那么amount>=3就是
    true
    ,所以第一个when将测试
    amount==true
    。显然不是,所以它将转到下一个,下一个是
    false
    ,它也不是false,所以case语句将返回
    nil
    ,然后您会得到一个错误,说
    nil类不能被强制

    第二种情况也是如此

    正确的解决方案是使用上述方法之一:

    要么:

    score = 0
    ammount = 4
    
    score += case
      when ammount >= 3; 10
      when ammount < 3; 1
    end
    

    您混合了两种类型的案例陈述:

    score += amount >= 3 ? 10 : 1
    
  • 问题:

    为什么你的代码不起作用

    回答:

    当您在
    案例中指定变量时
    ,当
    测试时,将对每个
    应用隐式
    =
    操作。在您的情况下,
    amount
    是4,它大于3,那么amount>=3就是
    true
    ,所以第一个when将测试
    amount==true
    。显然不是,所以它将转到下一个,下一个是
    false
    ,它也不是false,所以case语句将返回
    nil
    ,然后您会得到一个错误,说
    nil类不能被强制

    第二种情况也是如此

    正确的解决方案是使用上述方法之一:

    要么:

    score = 0
    ammount = 4
    
    score += case
      when ammount >= 3; 10
      when ammount < 3; 1
    end
    

    这正是@ZachKemp所说的。当然,但在这种情况下,我对分数变量有其他选择。我的例子简化了很多。@MarkThomas在提交后看到了。。。一定是在同一时间提交的。。这正是@ZachKemp所说的。当然,但在这种情况下,我对分数变量有其他选择。我的例子简化了很多。@MarkThomas在提交后看到了。。。一定是在同一时间提交的..哦,这就是争论的全部!谢谢你的快速回复。附言:顺便说一下,这个例子被简化了,以便开始对话,真实的例子更大。哦,这都是关于论点的!谢谢你的快速回复。附:顺便说一下,为了开始对话,这个例子被简化了,真实的例子更大。
    score = 0
    ammount = 4
    
    score += case ammount
      when 3..(1.0/0.0); 10
      when -(1.0/0.0)...3; 1
    end