我正在经历Ruby编程-实用的程序员指南并偶然发现了这段代码:
class SongList
def [](key)
if key.kind_of?(Integer)
return @songs[key]
else
for i in [email protected]
return @songs[i] if key == @songs[i].name
end
end
return nil
end
end
我不明白定义[]方法是如何工作的?
为什么键位于[]之外,但是调用该方法时却位于[]内部?
密钥可以不带括号吗?
我意识到有更好的方法来编写此代码,并且知道如何编写自己的有效方法,但是此[]方法让我感到困惑...非常感谢您的帮助,谢谢
所有的回答
与许多语言不同,Ruby中的方法可以包含一些特殊字符。其中之一是数组查找语法。
如果要实现自己的哈希类,则在其中检索哈希中的项目时,您想反转它,则可以执行以下操作:
您可以通过使用以下代码调用哈希来证明这一点:
因此,def []定义了您执行操作时使用的方法
my_array["key"]
您可能觉得很奇怪的其他方法是:只是澄清一下,
[]
方法与数组或哈希无关。采取以下(人为)示例:这只是语法糖。有某些语法模式可以转换为消息发送。特别是
是相同的
同样适用于
==
,!=
,<
,>
,<=
,>=
,<=>
,===
,&
,|
,*
,/
,-
,%
,**
,>>
,<<
,!==
,=~
和!~
也一样也,
是相同的
同样适用于
~
.然后,
是相同的
同样适用于
-
.加,
是相同的
二传手也有特殊的语法:
是相同的
最后但并非最不重要的一点是,有特殊的索引语法:
是相同的
和
是相同的
方括号是方法名称,例如
Array#size
你有Array#[]
作为一种方法,甚至可以像其他任何方法一样使用它:最后一个类似于语法糖,其功能与第一个完全相同。的
Array#+
工作类似:您甚至可以添加如下数字:
相同的作品
/
,*
,-
还有很多。它是一个运算符重载程序,它重写或补充您已定义的类或要修改其行为的类中方法的行为。您可以对[]以外的其他运算符执行此操作。在这种情况下,您正在修改在SongList类的任何实例上调用[]时的行为。
如果您具有songlist = SongList.new,然后执行songlist [“ foobar”],则您的自定义def将开始运行,并假定“ foobar”将作为参数(键)传递,并且将对“ foobar”进行传递“无论方法说什么,都应该做关键。
尝试
Leave a Reply