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