在Ruby中编写三元组的最短方法是返回nil的其他值?

时间:2012-10-03 23:55:31

标签: ruby-on-rails ruby

通常我想写一些如果true返回“是”的内容,如果false则返回“否”,或者如果nil则返回“NA”(或任何其他字符串)。目前我这样做:

@contact.boolean ? 'Yes' : (@contact.boolean.nil? ? "NA" : "No")

这是写这个的最短路吗?

4 个答案:

答案 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)';

对于任何阅读代码的人来说,这是一个很好的视觉暗示。