簡體   English   中英

將常量傳遞給方法,導致語法錯誤。 使用的Splat運算符

[英]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.

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