簡體   English   中英

點和運算符Ruby之間的區別

[英]Difference between dot and operator notation 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)) 

- 運算符就是方法| Ruby初學者

至於性能差異:

# 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(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)

結果尚無定論。

使用內聯運算符而不是點方法等效項時,性能幾乎沒有可衡量的差異。

同樣,第一個操作始終是最慢的,因此為什么要多次比較它以比較基准順序。

參考文獻:

tl; dr:運算符表示法是點表示法的語法糖。 我不會期望任何明顯的性能差異。

如果您查看Ruby的語法 ,則會發現以下內容:

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

這基本上表明,在您的示例中,像+這樣的二進制運算符具有一個接收器,一個ID(將其視為符號的CRuby)和一個參數,就像帶有一個參數的方法調用一樣。

如果再查看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));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM