当我在字符串上运行size
和length
时,它们会返回相同的值。
"akash".size # => 5
"akash".length # => 5
这两种方法有什么区别?
答案 0 :(得分:14)
在Ruby中,方法可以被覆盖,因此有些类可以有多种方法可以产生相同的结果,因此可以在一种方法中轻松覆盖行为,而不会影响另一种方法。有些类使用单独的方法执行此操作,而其他类将此行为实现为别名。
这是什么以及为什么通常是一种语言实现决策,在没有询问实现代码的Ruby Core团队成员的情况下,无法正常回答。因此,问题的这一部分超出了Stack Overflow的范围。假设别名方法不会像工作方法那样经常进行猴子修补,这是一个合理的假设,但它只是假设。
如果您需要真正的规范答案,则必须深入了解SVN来源,搜索错误跟踪器讨论,或直接询问核心团队。但是,我在下面提供了实用分析。
例如,Ruby String#size和String#length方法实际上是单独的方法,但内部Ruby调用相同的C源代码来实现它们:
rb_str_length(VALUE str)
{
return LONG2NUM(str_strlen(str, NULL));
}
这纯粹是一个实现细节。从Ruby VM的角度来看,它们实际上是分开的方法,恰好共享底层的C实现以提高速度。您应该能够在String对象上重新定义#size或#length而不改变两者的行为,尽管这样做通常会干扰REP,例如Pry或IRB。
另一方面,一些类将#size和#length实现为别名。例如,Array#size被明确定义为Array#length的别名。因此,这会将原始方法名称的副本创建为#size,因此您应该能够重新定义别名版本而不更改原始#length方法的行为。
这个问题实际上是一个差异,而不是行为。在实践中,似乎唯一有意义的区别在于哪个 Ruby组件实现了类似工作的行为。可能存在遗留原因,性能原因,或者它可能只是一个没有人关心文件或修复的错误。
由于行为是理智的,并且并没有真正违反Principle of Least Surprise,因此我将其视为次要语言怪癖。但是,任何对此感到更强烈的人都应该file a bug。
答案 1 :(得分:5)
size
和length
字符串之间没有区别。你喜欢哪一个基本上是风格问题。
答案 2 :(得分:2)
他们是完全相同的。这只是别名。
检查this article以获取更多信息,同时在count
。
答案 3 :(得分:0)
与其他人所说的相反,.length
和 .size
在用法上至少存在一个差异。
.size
可用于整数,而 .length
引发 NoMethodError
。