【问题标题】:How to pass argument to the method definition of `[]`?如何将参数传递给`[]`的方法定义?
【发布时间】:2019-01-24 11:01:13
【问题描述】:

如何将参数传递给A 上的[] 的单例方法的定义,即A['some_argument']

class A
  def self.[]
    # some_argument
  end
end

【问题讨论】:

  • methods 的文档包含[][]= 的示例(您必须向下滚动一点)

标签: ruby methods


【解决方案1】:

就像任何其他方法一样,使用参数列表:

class A 
  def self.[](arg)
    puts arg
  end  
end  

A[1]
# => 1

【讨论】:

  • @ray: 你怎么能从一个块中分辨出方法{}?至于<> - 好问题,也许没有人需要它,仅此而已。
  • 也许他们在将静态类型和泛型引入 ruby​​ 时将其保存:)
  • @ray 许多编程语言使用方括号来引用集合的元素,因此arr[1]str[1] 是常见的构造。另一方面,像obj<1> 这样的东西会很不寻常。而obj{1} / obj(1) 将通过块参数/方法调用进行推断。
  • @Stefan obj<1> 也会与普通的 less 和 greater 方法发生冲突。考虑class C; def <(other); 42; end; endC.new <100> 5 返回true
  • 定义和其他方法一样。 用法不同,因为上面提到的语法糖。
【解决方案2】:

已经给出了很好的答案,但我认为他们没有提到重要的一点。

方法[],当通常以foo[params] 形式使用时,实际上是语法糖形式。底层方法名称为[],在底层形式中调用为foo.[](params)

语法糖玩转语法,将foo[params] 形式的方法调用转换为foo.[](params)。但这在方法定义中不起作用,因此您必须以底层形式定义此类方法,而不是语法糖形式。

【讨论】:

    【解决方案3】:
    class A
      def self.[](*args)
        puts args
      end
    end
    
    > A[1,2,3]
       1
       2
       3
    

    【讨论】:

      【解决方案4】:

      您还可以实现“设置”功能

      class A
        def self.[]=(key, value)
          puts "#{key} = #{value}"
        end
      end
      
      A['one'] = '1'
      # one = 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-18
        • 1970-01-01
        • 1970-01-01
        • 2021-12-13
        • 2012-02-23
        • 2011-07-25
        相关资源
        最近更新 更多