如何使用或參考已在基類/超類中定義的 lambda?
超類代碼
module Api
class ApplicationSerializer
include JSONAPI::Serializer
# I Also tried it this way
# serializer_for_proc = -> (object) { SerializerLookup.new.(object) }
def serializer_for_proc
-> (object) { SerializerLookup.new.(object) }
end
end
end
子類代碼
module Api
class AnswerSerializer < ApplicationSerializer
attributes :values, :created_at, :updated_at, :usage
belongs_to :question, serializer: serializer_for_proc # NameError (undefined local variable or method `serializer_for_proc'
end
end
uj5u.com熱心網友回復:
正如所展示的,serializer_for_proc是 Api::ApplicationSerializer 的一個實體方法,但您試圖直接在類上(或者更確切地說,直接在子類上)呼叫它。換句話說,以下所有失敗的原因或多或少是相同的:
belongs_to :question, serializer: serializer_for_proc
belongs_to :question, serializer: ApplicationSerializer.serializer_for_proc
belongs_to :question, serializer: AnswerSerializer.serializer_for_proc
你從來沒有真正定義過ApplicationSerializer.serializer_for_proc,你已經定義了傳統上寫的東西ApplicationSerializer#serializer_for_proc,或者換句話說,ApplicationSerailizer.new.serializer_for_proc。
解決此問題的最快方法是使原始方法定義成為類方法:
module Api
class ApplicationSerializer
include JSONAPI::Serializer
def self.serializer_for_proc
-> (object) { SerializerLookup.new.(object) }
end
end
end
您在評論中寫道,當您將其復制到 AnswerSerializer 檔案時它確實有效,但這不太可能(基本上不可能)。什么將作業將復制serializer_for_proc = -> (object) { SerializerLookup.new.(object) }版本到AnswerSerializer檔案,因為那樣的話serializer_for_proc是不是在所有的方法名,它是在短短一個區域變數AnswerSerializer檔案一樣x = 5。但這不是可繼承的。
另一種解決方案(雖然我不太喜歡一個)是創建serializer_for_proc一個常量,例如:
# One file
module Api
class ApplicationSerializer
include JSONAPI::Serializer
SERIALIZER_FOR_PROC = -> (object) { SerializerLookup.new.(object) }
end
end
# Another file
module Api
class AnswerSerializer < ApplicationSerializer
attributes :values, :created_at, :updated_at, :usage
belongs_to :question, serializer: SERIALIZER_FOR_PROC
end
end
那行得通,但我不喜歡依賴它,因為 Ruby 中基于繼承的常量查找有一些非常奇怪的邊緣情況。Api::ApplicationSerializer::SERIALIZER_FOR_PROC如果我想使用常量,我個人只會使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/380710.html
