[英]How to use rescue_from for an array of errors with splat operator
[英]Passing a Constant into a method, leading to syntax errors. Splat operator in use
我有一個代碼段,該代碼段生成了一個模型屬性名稱和setter等效項的扁平數組,然后使用splat運算符將此數組作為變量傳遞給Module.delegate()
,將所有User.attributes
給BaseUser類。 這很好。
參見https://apidock.com/rails/Module/delegate
class BaseUser
include ActiveModel::Model
attr_accessor :user
# The code snippet described above
delegate(*::User.attribute_names.map {|attr| [attr, "#{attr}="] }.flatten, to: :user)
def initialize(user_attributes)
@user = ::User.new(user_attributes)
end
end
現在,我希望將此代碼段重寫為可以將[ModelName] < ActiveRecord::Base
類常量作為參數的方法。 但是,我的嘗試(如下)導致一些語法錯誤。 我要去哪里錯了?
def delegate_getters_and_setters(model)
delegate(*::model.attribute_names.map {|attr| [attr, "#{attr}="] }.flatten, to: model.downcase.to_sym)
end
謝謝您的幫助!
編輯:
以下是Sublime Text 3突出顯示的語法錯誤。
-:6: syntax error, unexpected tIDENTIFIER, expecting tCONSTANT
delegate(*::model.attribute_names.map {|attr| ...
^
-:6: syntax error, unexpected tLABEL, expecting '='
...ttr, "#{attr}="] }.flatten, to: model.downcase.to_sym)
... ^
-:6: syntax error, unexpected ')', expecting keyword_end
::model
沒有意義。 model
是局部變量。 只需刪除它前面的雙冒號即可:
delegate(*model.attrib......
現在,我希望將此代碼段重寫為可以將
[ModelName] < ActiveRecord::Base
類常量作為參數的方法。
您不能將常量作為參數。 您只能將對象作為參數。 常數不是對象。
但是,我的嘗試(如下)導致一些語法錯誤。 我要去哪里錯了?
您假設您正在獲取常量作為參數。 但是你沒有。 當有人打電話時
delegate_setters_and_getters(Foo)
您沒有將常量Foo
作為參數。 您不能,因為常量Foo
不是對象。 相反,常量Foo
在調用站點被取消引用,並且您可以在調用站點獲得Foo
解析為的任何對象(可能是類)作為參數。
它與任何其他表達式完全相同。 如果你打電話
delegate_setters_and_getters(foo)
您沒有將局部變量foo
作為參數傳遞,而是將foo
引用的對象作為參數傳遞。 (實際上,即使您願意 , 也無法將局部變量作為參數傳遞,因為變量不是對象。)
如果你打電話
delegate_setters_and_getters(bar.baz)
您沒有將方法調用bar.baz
作為參數傳遞,而是在通過取消引用局部變量bar
然后將該方法調用的返回值作為參數傳遞而獲得的對象上調用方法baz
。 (同樣,方法調用不是對象,因此即使您願意也無法傳遞它們。)
除了@mudasobwa所說的以外:
::
是常量的全限定名(FQN)語法的一部分。 前導::
有助於消除名稱解析的歧義。
在您的情況下,在delegate_getters_and_setters
常量名稱已經解析,並且model
是對常量*的引用,無論它是什么。
*當然,“引用常量”是指“引用常量所指向的同一對象”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.