通常我想写一些如果true
返回“是”的内容,如果false
则返回“否”,或者如果nil
则返回“NA”(或任何其他字符串)。目前我这样做:
@contact.boolean ? 'Yes' : (@contact.boolean.nil? ? "NA" : "No")
这是写这个的最短路吗?
答案 0 :(得分:9)
这是一个想法:
> {true => "Yes", false => "No", nil => "N/A"}[true]
=> "Yes"
所以,当然,你会做{true => "Yes", false => "No", nil => "N/A"}[value]
答案 1 :(得分:0)
将它移到方法怎么样?为什么需要做空?如果你将它移动到一个方法,你只需要调用它。
答案 2 :(得分:0)
差不多。您正尝试使用返回2个不同值的运算符返回3个不同的值,因此您需要双重网格。
您是否需要在对象中存储真或假?你能否存储“是”或“否”?如果是这样,假设你的属性被称为比布尔更好的东西,那么你可以简单地写
@contact.correct? || "(NA)"
答案 3 :(得分:0)
一旦你通过三元组进行单一的真/假测试,阅读时开始变得更难理解。这转化为维护问题。我建议转到case
声明:
case @contact
when true
'Yes'
when false
'No'
when nil
'(NA)'
end
其他语言使链式三元语句更具可读性;在Perl中使用复杂的链,因为它很容易以一种方式构建它们,以便于查看正在发生的事情。而不是写这个:
$contact == true ? 'Yes' : contact == false ? 'No' : '(NA)';
你可以写下来:
$contact == true ? 'Yes'
: contact == false ? 'No'
: '(NA)';
对于任何阅读代码的人来说,这是一个很好的视觉暗示。