【问题标题】:How to write a method in ruby that takes hash-style, square bracketed arguments, like mymethod[arg]?如何在 ruby​​ 中编写一个采用散列样式、方括号括起来的参数的方法,例如 mymethod[arg]?
【发布时间】:2021-09-01 03:04:03
【问题描述】:

我想用 ruby​​ 编写一个方法来替换当前仅返回哈希的方法。

所以目前我们有这个

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

可以这样调用:

some_stats[:foo]

我想用一个用 :foo 调用的方法来替换它,它会做一些更复杂的事情,只是构建一个哈希。但是,我希望以同样的方式调用它,使用方括号表示法。 EG

#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) 不起作用。不过我觉得这应该是可能的。

【问题讨论】:

    标签: ruby methods syntax


    【解决方案1】:

    你已经很接近了。 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
    

    【讨论】:

      【解决方案2】:

      您的原始方法不是用方括号调用;它被称为没有任何参数,但返回一个对象(在您的情况下为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]
      

      【讨论】:

      • some_stats 也可以返回一个 lambda,如果需要完成一些处理但对于整个班级来说还不够。
      猜你喜欢
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      • 2019-07-02
      • 2015-06-26
      • 1970-01-01
      • 2018-12-08
      • 2012-02-12
      • 2014-01-11
      相关资源
      最近更新 更多