在Ruby中如何定义方法工作?

我正在通过编程Ruby – 一个实用的程序员指南 ,并偶然发现了这段代码:

class SongList def [](key) if key.kind_of?(Integer) return @songs[key] else for i in 0...@songs.length return @songs[i] if key == @songs[i].name end end return nil end end 

我不明白如何定义[]方法的作品?

为什么是[]外的关键,但是当方法被调用时,它在[]内?

键可以没有括号?

我意识到有更好的方法来写这个,知道如何写我自己的方法,但这个[]方法只是困扰我…任何帮助,非常感谢,谢谢

Ruby中的方法不像许多语言可以包含一些特殊的字符。 其中之一是数组查找语法。

如果你要实现你自己的哈希类,在你的哈希中检索一个项目时,你想颠倒它,你可以做到以下几点:

 class SillyHash < Hash def [](key) super.reverse end end 

你可以通过调用下面的哈希来certificate这一点:

 a = {:foo => "bar"} => {:foo=>"bar"} a.[](:foo) => "bar" a.send(:[], :foo) => "bar" 

所以def []定义了当你执行my_array["key"]时使用的方法my_array["key"]其他可能看起来很奇怪的方法是:

 class SillyHash < Hash def [](key) super.reverse end def []=(key, value) #do something end def some_value=(value) #do something end def is_valid?(value) #some boolean expression end end 

为了澄清, []方法的定义与数组或散列无关。 采取以下(人为)的例子:

 class B def [] "foo" end end B.new[] => "foo" 

这只是句法糖。 有某些语法模式被转换为消息发送。 尤其是

 a + b 

是相同的

 a.+(b) 

==!=<><=>=<= >====&|*/-%**>><<!===~!~

也,

 !a 

是相同的

 a.! 

这同样适用于~

然后,

 +a 

是相同的

 a.+@ 

这同样适用于-

加,

 a.(b) 

是相同的

 a.call(b) 

还有一些特殊的设置语法:

 a.foo = b 

是相同的

 a.foo=(b) 

最后但并非最不重要的是,索引有特殊的语法:

 a[b] 

是相同的

 a.[](b) 

 a[b] = c 

是相同的

 a.[]=(b, c) 

方括号是方法的名称,如Array#size你有Array#[]作为一种方法,你甚至可以像使用任何其他方法使用它:

 array = [ 'a', 'b', 'c'] array.[](0) #=> 'a' array.[] 1 #=> 'b' array[2] #=> 'c' 

最后一个是句法糖,和第一个完全一样。 Array#+工作类似:

 array1 = [ 'a', 'b' ] array2 = [ 'c', 'd' ] array1.+(array2) #=> [ 'a', 'b', 'c', 'd' ] array1.+ array2 #=> [ 'a', 'b', 'c', 'd' ] array1 + array2 #=> [ 'a', 'b', 'c', 'd' ] 

你甚至可以添加这样的数字:

 1.+(1) #=> 2 1.+ 1 #=> 2 1 + 1 #=> 2 

/*-和更多的相同。