當我ActiveRecord今天查看源代碼時,我偶然發現了這些行
name = -name.to_s
https://github.com/rails/rails/blob/2459c20afb508c987347f52148210d874a9af4fa/activerecord/lib/active_record/reflection.rb#L24
和
ar.aggregate_reflections = ar.aggregate_reflections.merge(-name.to_s => reflection)
https://github.com/rails/rails/blob/2459c20afb508c987347f52148210d874a9af4fa/activerecord/lib/active_record/reflection.rb#L29
-操作員在符號上的用途是什么name?
uj5u.com熱心網友回復:
那是String#-@:
回傳一個凍結的,可能是預先存在的字串副本。
例子:
a = "foo"
b = "foo"
a.object_id #=> 6980
b.object_id #=> 7000
與:
a = -"foo"
b = -"foo"
a.object_id #=> 6980
b.object_id #=> 6980
uj5u.com熱心網友回復:
-操作員在符號上的用途是什么name?
您的優先規則錯誤:二進制訊息發送運算子 ( .) 的優先級高于其他所有運算子,這意味著-不適用于運算式,而是name應用于運算式name.to_s。
換句話說,你似乎認為這個運算式是這樣決議的:
(-name).to_s
# which is the same as
name.-@().to_s()
但它實際上被決議為
-(name.to_s)
# which is the same as
name.to_s().-@()
現在,我們不知道是什么name,但除非有人在認真地惹你,否則應該回傳一個. 換句話說,正如您所想的那樣,運算子并未應用于 a 。#to_s StringSymbol
因此,我們知道我們正在向-@a發送訊息,String因此可以查看String#-@檔案中的內容:
-string→frozen_string回傳一個凍結的,可能是預先存在的字串副本。
只要沒有設定任何實體變數,回傳的字串就會被去重。
默認情況下,動態創建String的 s 不會被凍結。只有靜態String文字是,取決于你的魔術評論設定# frozen_string_literals: true。String#-@被添加為別名,以允許您以盡可能少的句法噪音String#freeze凍結和去重 a 。String
相反的操作也可以作為String# @.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/446738.html
