簡體   English   中英

如何在 ruby​​ 中編寫一個采用散列樣式、方括號括起來的參數的方法,比如 mymethod[arg]?

[英]How to write a method in ruby that takes hash-style, square bracketed arguments, like mymethod[arg]?

我想用 ruby​​ 編寫一個方法來替換當前只返回散列的方法。

所以目前我們有這個

def some_stats
  {
    :foo => "bar",
    :zoo => "zar"
  }
end

可以這樣調用:

some_stats[:foo]

我想用一個用 :foo 調用的方法來替換它,它會做一些更復雜的事情,只是構建一個散列。 但是,我希望以相同的方式調用它,並使用方括號表示法。 例如

#this is a bit pseudo-cody but hopefully you get the idea.
def some_stats[](key)
  if key.to_s =~ /something/
    #do something
    return something
  else
    #do something else
    return something_else
  end
end

這仍然會像some_stats[:foo]一樣被調用

我無法計算出定義方法名稱的語法:上面的def some_stats[](key)不起作用。 不過我覺得這應該是可能的。

你很接近。 object[sth]只是object.[](sth)的語法糖。 因此,要執行您需要的操作,您必須定義some_stats方法,該方法返回定義[]方法的對象:

class Stats
  def [](key)
    if key.to_s =~ /something/
     #do something
     return something
  else
    #do something else
    return something_else
  end
end

def some_stats
  Stats.new
end

some_stats[:something_new] #=> something
some_stats[:not_new] #=> something_else

您的原始方法不是用方括號調用的 它在沒有任何參數的情況下被調用,但返回一個對象(在你的情況下是一個Hash ),它定義了方法:[] ,因此理解方括號。 您的方法調用相當於

(some_stats())[:foo]

或者,更明確地說,

x = some_stats()
x[:foo]

因此你需要 - 在你的方法中返回一個提供[]方法的類的實例。 假設您編寫了一個名為MyClass的類,它定義了一個[] 然后你可以寫一個函數

def some_stats
  if _your condition goes here_
    { ... } # Return your Hash
  else
    Myclass.new
  end
end

這將用作

some_stats[:whatever]

但是,要真正有用,您的條件將使用該方法的參數,即

def some_stats(param)
  if param < 4000
    { ... } # Return your Hash
  else
    Myclass.new
  end
end

你會調用它

some_stats(4711)[:whatever]

暫無
暫無

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

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