以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 =~
)你留下隐式类型转换,而在不是时显式地做它(例如,你自己的属性,特别是如果它们有多个返回类型)。
我很感激社区可以就这个问题分享任何见解或经验。