在Ruby中,方法可以被重写,所以有些类有多个方法,导致相同的结果,这样行为可以很容易地在一个方法中被重写而不会影响其他方法。有些类使用单独的方法来实现这一点,而其他类则将此行为作为别名实现。 Which is which,and why,通常是一个语言实现的决定,如果不问实现代码的Ruby Core团队成员,就无法得到规范的回答。因此,这部分问题超出了Stack Overflow的范围。假设别名方法不像类似工作方法那样经常被猴子打补丁是一个合理的假设,但它只是一个假设。 如果你需要一个真正规范的答案,你将不得不挖掘SVN源代码,搜索bug跟踪讨论,或者直接询问核心团队。
这个问题实际上是实现的差异,而不是行为的差异。在实践中,似乎唯一有意义的区别在于 * 哪个 * Ruby组件实现了类似工作的行为。可能有遗留的原因,性能的原因,或者它可能只是一个没有人足够关心的bug。 由于 * 行为 * 是正常的,并没有真正违反Principle of Least Surprise,我把它作为一个小的语言怪癖。然而,任何人谁感觉更强烈,肯定应该file a bug。
5条答案
按热度按时间rnmwe5a21#
摘要
在Ruby中,方法可以被重写,所以有些类有多个方法,导致相同的结果,这样行为可以很容易地在一个方法中被重写而不会影响其他方法。有些类使用单独的方法来实现这一点,而其他类则将此行为作为别名实现。
Which is which,and why,通常是一个语言实现的决定,如果不问实现代码的Ruby Core团队成员,就无法得到规范的回答。因此,这部分问题超出了Stack Overflow的范围。假设别名方法不像类似工作方法那样经常被猴子打补丁是一个合理的假设,但它只是一个假设。
如果你需要一个真正规范的答案,你将不得不挖掘SVN源代码,搜索bug跟踪讨论,或者直接询问核心团队。
String类:不同的方法
例如,Ruby String#size和String#length方法实际上是独立的方法,但Ruby内部调用相同的C源代码来实现它们:
字符串
这纯粹是一个实现细节。从Ruby VM的Angular 来看,它们实际上是独立的方法,只是为了速度而碰巧共享底层C实现。您应该能够在不改变String对象的行为的情况下重新定义#size或#length,尽管这样做经常会干扰REPL,如Pry或IRB。
Array类:别名方法
另一方面,有些类实现#size和#length作为别名。例如,Array#size被显式定义为Array#length的别名。因此,这将创建原始方法名称的 * 副本 * 为#size,因此您应该能够重新定义别名版本,而无需更改原始#length方法的行为。
离别的思念
这个问题实际上是实现的差异,而不是行为的差异。在实践中,似乎唯一有意义的区别在于 * 哪个 * Ruby组件实现了类似工作的行为。可能有遗留的原因,性能的原因,或者它可能只是一个没有人足够关心的bug。
由于 * 行为 * 是正常的,并没有真正违反Principle of Least Surprise,我把它作为一个小的语言怪癖。然而,任何人谁感觉更强烈,肯定应该file a bug。
7cjasjjr2#
字符串的
size
和length
之间没有区别。你喜欢哪一个本质上是一个风格问题。rks48beu3#
他们是一样的。只是化名。
查看this article了解更多信息,也可以在
count
上查看。mec1mxoz4#
与其他人所说的相反,
.length
和.size
在使用方面至少有一个区别。.size
可以用于整数,而.length
引发NoMethodError
。fzsnzjdm5#
我更喜欢大小,因为它节省了我打字/阅读2个字符。