如何将参数传递给`[]`的方法定义?

sha*_*aan 5 ruby methods

我怎么能传递一个参数的单方法的定义[]A,换句话说A['some_argument']

class A
  def self.[]
    # some_argument
  end
end
Run Code Online (Sandbox Code Playgroud)

mrz*_*asa 8

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

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

A[1]
# => 1
Run Code Online (Sandbox Code Playgroud)

  • @Stefan同样`obj <1>`会与普通的越来越少的方法发生冲突.考虑`C级; def <(其他); 42; 结束; end`和`C.new <100> 5`返回`true`. (4认同)
  • @ray许多编程语言使用方括号来引用集合的元素,因此`arr [1]`或`str [1]`是常见的结构.另一方面,像'obj <1>`之类的东西会很不寻常.并且`obj {1}`/`obj(1)`将使用块参数/方法调用进行推断. (2认同)

saw*_*awa 7

已经给出了很好的答案,但我认为他们错过了一个重要的观点.

[]通常在表单中使用的方法foo[params]实际上是语法糖形式.底层方法名称是[],并在底层表单中调用它foo.[](params).

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


Len*_*ran 5

class A
  def self.[](*args)
    puts args
  end
end

> A[1,2,3]
   1
   2
   3
Run Code Online (Sandbox Code Playgroud)