0

String#=~函数为例。如果找到匹配项,它将返回第一个匹配项的索引,这Fixnum在布尔环境中始终表现为真。如果未找到匹配项,则返回 null,即为 false。

现在假设我有一堂课:

class A
  attr_accessor :myprop

  # prints "I am awesome" if #myprop matches /awesome/
  # and "I am not awesome" otherwise
  def report_on_awesomeness!
    puts "I am #{myprop =~ /awesome/ ? 'awesome' : 'not awesome'}."
  end
end

这段代码几乎可以按预期工作,但试用条件运算符中的第一个元素是我的问题的主题。

不包装是个好主意myprop =~ /awesome/吗?我不是在谈论将其抽象为另一种方法def is_awesome?; myprop =~ /awesome/; end,而是我当前的约定(强制 Ruby 将 Fixnums 隐式转换为 true 并将 nils 转换为 false)是否比将条件包装到我自己转换的内容中更可取。我可以很容易地做到这一点:

class A
  attr_accessor :myprop

  # prints "I am awesome" if #myprop matches /awesome/
  # and "I am not awesome" otherwise
  def report_on_awesomeness!
    puts "I am #{(myprop =~ /awesome/).nil? ? 'not awesome' : 'awesome'}."
  end
end

我看到的第一种风格的优点:

  • 大多数维护者(包括未来的我)都习惯了隐式类型
  • 它更短

我看到第二种风格的优点:

  • =~更明显的是,该方法的结果与其布尔解释之间的关系是什么
  • 它使您可以更自由地使用更具创造性的显式转换

我怀疑可能有一些中间立场,在它是惯用的情况下(例如,正则表达式匹配 using =~)你留下隐式类型转换,而在不是时显式地做它(例如,你自己的属性,特别是如果它们有多个返回类型)。

我很感激社区可以就这个问题分享任何见解或经验。

4

1 回答 1

0

恕我直言,这是个人选择。你可以采用任何风格,因为通过这种方式工作会让你感觉更好。

一旦我定义true?Object它的布尔值(另一个名字可能是to_bool):

class Object
  def true?
    !!self
  end
end

但是双 bang (!!)更容易将任何东西转换为布尔值,我更喜欢使用它——但不是在任何地方都使用它。我只在需要明确的布尔值时才使用它(在这个问题的情况下我不会使用它)。

顺便说一句,false.nil? == false; 这可能会导致混乱。

于 2011-09-12T12:02:47.000 回答