![](/img/trans.png)
[英]Difference between 3-dot-range operator and 2-dot-range operator in flip flop 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))
至於性能差異:
# 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.