点和操作员符号ruby之间的差异



我想知道Ruby中的点和操作员符号之间的差异。这是一些示例

# Use dot notation to invoke a method 
"I'm thirty one characters long!".length
# => 31
# Use operator notation to invoke a method
"Kit" + "tens!"
# => "Kittens!"

由于两个调用方法并返回类似的对象,因此我怀疑点表示法或操作员方法更有效。任何想法都将受到赞赏。

[...]如果我们使用该点.表示对象调用方法,那么2 + 3 * 4中的点在哪里?

诀窍是:Ruby默默地为您添加了它们。如果您编写以下代码:

number = 2 + 3 * 4

然后Ruby将其转换为以下内容:

number = 2.+(3.*(4))

- 操作员是方法|初学者的红宝石

至于性能差:

# bmbm_dot_vs_operators.rb
require "benchmark"
Benchmark.bmbm do |x|
  x.report("dots") { 2.+(3.*(4)) }
  x.report("operators") { 2 + 3 * 4 }
  x.report("operators") { 4 + 2 * 3 }
  x.report("dots") { 4.+(2.*(3)) }
end

在我的系统上运行(MacBook Pro(Retina,15英寸,2013年底))时,它会产生以下结果

$ ruby bmbm_dot_vs_operators.rb
Rehearsal ---------------------------------------------
dots        0.000000   0.000000   0.000000 (  0.000005)
operators   0.000000   0.000000   0.000000 (  0.000002)
operators   0.000000   0.000000   0.000000 (  0.000002)
dots        0.000000   0.000000   0.000000 (  0.000002)
------------------------------------ total: 0.000000sec
                user     system      total        real
dots        0.000000   0.000000   0.000000 (  0.000002)
operators   0.000000   0.000000   0.000000 (  0.000002)
operators   0.000000   0.000000   0.000000 (  0.000002)
dots        0.000000   0.000000   0.000000 (  0.000002)

结果尚无定论。

在使用dot方法等效物上使用内联操作员时,性能几乎没有可测量的差异。

另外,第一个操作始终是最慢的,因此为什么将其包括在基准顺序的比较中多次。

参考:

  • 模块:基准(Ruby 2.0.0)

tl; dr:操作员符号是DOT符号的句法糖。我不会期望任何明显的性能差异。

如果您查看Ruby的语法,您会发现以下内容:

call_bin_op(recv,id,arg1) call_bin_op_gen(parser, (recv),(id),(arg1))

这基本上说,示例中的二进制运算符,例如+,有一个接收器,一个ID(将其视为符号的笨拙)和一个参数,就像一个用一个参数调用的方法调用一样。

如果您然后查看call_bin_op_gen,您会发现它实际上转化为呼叫:

static NODE *
call_bin_op_gen(struct parser_params *parser, NODE *recv, ID id, NODE *arg1)
{
    value_expr(recv);
    value_expr(arg1);
    return NEW_CALL(recv, id, NEW_LIST(arg1));
}

最新更新