在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
与/
, *
, -
和更多的相同。