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

5
我该如何将参数传递给 A 的单例方法 [] 的定义,换句话说,如何传递参数 'some_argument'A['some_argument']
class A
  def self.[]
    # some_argument
  end
end

6
method的文档中包含了[][]=的例子(需要向下滚动一点)。 - Stefan
4个回答

8

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

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

A[1]
# => 1

1
@ray:你怎么区分方法 {} 和块?至于 <> - 很好的问题,也许没有人需要它,就这样。 - Sergio Tulentsev
1
也许他们正在为将静态类型和泛型引入Ruby的时候保留它 :) - Sergio Tulentsev
2
@ray 许多编程语言使用方括号来引用集合的元素,因此 arr[1]str[1] 是常见的结构。而像 obj<1> 这样的写法则相当不寻常。而 obj{1} / obj(1) 则会与块参数 / 方法调用产生歧义。 - Stefan
4
@Stefan,obj<1> 也会与普通的小于和大于方法冲突。请考虑 class C; def <(other); 42; end; endC.new <100> 5 返回 true 的情况。 - Aleksei Matiushkin
1
“定义”与其他方法类似,“用法”则有所不同,因为上述语法糖的存在。 - mrzasa
显示剩余3条评论

7
好的答案已经给出,但我认为它们忽略了一个重要的点。
方法[],当以foo[params]的形式普通使用时,实际上是语法糖形式。底层方法名称是[],在底层形式中调用它将是foo.[](params)
语法糖玩弄语法,并将foo[params]形式的方法调用转换为foo.[](params)。但这在方法定义中不起作用,因此必须以底层形式而非语法糖形式定义此类方法。

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

> A[1,2,3]
   1
   2
   3

1
您也可以实现“set”功能。
class A
  def self.[]=(key, value)
    puts "#{key} = #{value}"
  end
end

A['one'] = '1'
# one = 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接