【问题标题】:Built-in Ruby methods内置 Ruby 方法
【发布时间】:2014-01-01 16:20:58
【问题描述】:

如果有定义的内置 ruby​​ 方法,是否总是最好使用内置方法?

如果我有如下代码:

if i == 0

改用内置的 ruby​​ 方法有什么好处?

if i.zero?

【问题讨论】:

  • 可读性可能吗?
  • 您问的是i.zero? 还是i == 0 还是通用的内置方法?附言。 ==也是方法。
  • 对于这个特定的例子,zero? 的普遍使用将消除每天成千上万的无意i = 0
  • 有任何答案有帮助吗?

标签: ruby methods


【解决方案1】:

i.zero? 仅在 iNumeric 对象时有效。

i = nil
i == 0
# => false
i.zero?
# NoMethodError: undefined method `zero?' for nil:NilClass
#        from (irb):5
#        from C:/Ruby200-x64/bin/irb:12:in `<main>'

【讨论】:

  • 影响?当i 打算是数字时,zero? 可能是首选,那么如果不是,会引发异常吗?如果我们想知道一个对象是不是 Numeric 或 Numeric 且不为零,== 可能是首选?
【解决方案2】:

我已经写了简单的测试:

require 'benchmark'

l = 0

funcs =
[ proc { l == 0 },
  proc { l.zero? },
]

def ctime func
   time = 0
   1000.times { time += Benchmark.measure { 1000.times { func.call } }.to_a[5].to_f }
   rtime = time /= 1000000
end

funcs.each {| func | p ctime( func ) }

# 4.385690689086914e-07
# 4.829726219177246e-07

如您所见,:zero? 方法相对于:== 方法需要一些额外的时间(大约 10%),因此它比:== 慢。其次,由于:zero? 方法仅包含在Numeric 类及其后代中,因此您只能在数字上使用它。

【讨论】:

    【解决方案3】:

    据我所知,这些方法用于执行以下操作:

    array.delete_if &:zero?
    

    为了保持一致性,最好在 if 语句等中使用 == 0,但现在这更多的是见仁见智。

    如果您认为zero? 更具可读性,请使用它。

    【讨论】:

      【解决方案4】:

      我已经制定了一个新年决心,即更多地使用以问号结尾的 Ruby 方法。我认为这样做会使我的代码更具表现力,并减少错误。后者最明显的例子是使用eql? 而不是==(用于比较Object 类的对象,不要与equal? 混淆)。但是您多久看到一次x.eql? 7 而不是x == 7?可能比你看到的 x = 7 少,而 x == 7 本来就是这样。

      其他一些似乎没有得到应有的尊重包括(上述)zero?nonzero?integer?empty?any?all?nil?、@ 987654336@、one?start_with?end_with?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-07
        • 1970-01-01
        • 2014-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多