【发布时间】:2019-01-24 11:01:13
【问题描述】:
如何将参数传递给A 上的[] 的单例方法的定义,即A['some_argument']?
class A
def self.[]
# some_argument
end
end
【问题讨论】:
-
methods 的文档包含
[]和[]=的示例(您必须向下滚动一点)
如何将参数传递给A 上的[] 的单例方法的定义,即A['some_argument']?
class A
def self.[]
# some_argument
end
end
【问题讨论】:
[] 和[]= 的示例(您必须向下滚动一点)
就像任何其他方法一样,使用参数列表:
class A
def self.[](arg)
puts arg
end
end
A[1]
# => 1
【讨论】:
{}?至于<> - 好问题,也许没有人需要它,仅此而已。
arr[1] 或str[1] 是常见的构造。另一方面,像obj<1> 这样的东西会很不寻常。而obj{1} / obj(1) 将通过块参数/方法调用进行推断。
obj<1> 也会与普通的 less 和 greater 方法发生冲突。考虑class C; def <(other); 42; end; end 和C.new <100> 5 返回true。
已经给出了很好的答案,但我认为他们没有提到重要的一点。
方法[],当通常以foo[params] 形式使用时,实际上是语法糖形式。底层方法名称为[],在底层形式中调用为foo.[](params)。
语法糖玩转语法,将foo[params] 形式的方法调用转换为foo.[](params)。但这在方法定义中不起作用,因此您必须以底层形式定义此类方法,而不是语法糖形式。
【讨论】:
class A
def self.[](*args)
puts args
end
end
> A[1,2,3]
1
2
3
【讨论】:
您还可以实现“设置”功能
class A
def self.[]=(key, value)
puts "#{key} = #{value}"
end
end
A['one'] = '1'
# one = 1
【讨论】: