2

通常我想写一些返回 "Yes" if true、 "No" iffalse或 "NA" (或任何其他字符串) if的东西nil。目前我这样做:

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

这是写这个的最短方法吗?

4

4 回答 4

9

这是一个想法:

> {true => "Yes", false => "No", nil => "N/A"}[true]
 => "Yes" 

所以,当然,你会做{true => "Yes", false => "No", nil => "N/A"}[value]

于 2012-10-04T00:02:32.677 回答
0

将其移至方法怎么样?为什么一定要短?如果你把它移到一个方法中,那么你只需要调用它。

于 2012-10-04T00:02:38.347 回答
0

差不多。您正在尝试使用返回 2 个不同值的运算符返回 3 个不同的值,因此您需要双三元组。

你需要在你的对象中存储真或假吗?你不能存储“是”或“否”吗?如果是这样,并且假设您的属性被称为比布尔值更好的东西,那么您可以简单地写

@contact.correct? || "(NA)"
于 2012-10-04T00:02:59.833 回答
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)';

对于任何阅读代码的人来说,这确实是一个很好的关于逻辑的视觉提示。

于 2012-10-04T04:46:27.790 回答