簡體   English   中英

如何將單個對象轉換為ruby中的Enumerable

[英]How can I turn a single object into something that is Enumerable in ruby

我有一個方法可以返回單個對象或對象集合。 我希望能夠在該方法的結果上運行object.collect,無論它是否是單個對象或集合。 我怎樣才能做到這一點?

profiles = ProfileResource.search(params)
output = profiles.collect do | profile |
    profile.to_hash
end

如果配置文件是單個對象,當我嘗試在該對象上執行collect時,我會收到NoMethodError異常。

小心使用展平方法,如果search()返回嵌套數組,則可能會導致意外行為。

profiles = ProfileResource.search(params)
profiles = [profiles] if !profiles.respond_to?(:collect)
output = profiles.collect do |profile|
    profile.to_hash
end

這是一個班輪:

[*ProfileResource.search(params)].collect { |profile| profile.to_hash }

訣竅是splat(*)將單個元素和枚舉變為參數列表(在本例中為新數組運算符)

profiles = [ProfileResource.search(params)].flatten
output = profiles.collect do |profile|
    profile.to_hash
end

另一種方法是認識到Enumerable要求您提供每個方法。

所以。 你可以將Enumerable混合到你的班級中並給它一個假的每個都有效....

class YourClass
  include Enumerable

  ... really important and earth shattering stuff ...

  def each
    yield(self) if block_given?
  end
end

這樣,如果您從搜索中單獨返回單個項目,則可枚舉方法仍將按預期工作。

這種方式的優點是,它的所有支持都在你的類中,而不是在必須多次重復的地方之外。

當然,更好的方法是更改​​搜索的實現,使其返回一個數組而不管返回多少項。

ProfileResource類的search方法中,始終返回一組對象(通常是一個Array),即使它只包含一個對象。

如果集合是數組,則可以使用此技術

profiles = [*ProfileResource.search(params)]
output = profiles.collect do | profile |
    profile.to_hash
end

這樣可以保證您的配置文件始終是一個數組。

profiles = ProfileResource.search(params)
output = Array(profiles).collect do |profile|
    profile.to_hash
end

您可以首先使用“pofiles.respond_to?”檢查對象是否響應“collect”方法。

來自編程Ruby

obj.respond_to?(aSymbol,includePriv = false) - > true或false

如果obj響應給定方法,則返回true。 僅當可選的第二個參數的計算結果為true時,才會在搜索中包含私有方法。

您也可以使用Kernel#Array方法。

profiles = Array(ProfileResource.search(params))
output = profiles.collect do | profile |
    profile.to_hash
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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