`size`和`length`方法有什么区别

时间:2016-03-05 16:38:33

标签: ruby string

当我在字符串上运行sizelength时,它们会返回相同的值。

"akash".size # => 5
"akash".length # => 5

这两种方法有什么区别?

4 个答案:

答案 0 :(得分:14)

摘要

在Ruby中,方法可以被覆盖,因此有些类可以有多种方法可以产生相同的结果,因此可以在一种方法中轻松覆盖行为,而不会影响另一种方法。有些类使用单独的方法执行此操作,而其他类将此行为实现为别名。

这是什么以及为什么通常是一种语言实现决策,在没有询问实现代码的Ruby Core团队成员的情况下,无法正常回答。因此,问题的这一部分超出了Stack Overflow的范围。假设别名方法不会像工作方法那样经常进行猴子修补,这是一个合理的假设,但它只是假设。

如果您需要真正的规范答案,则必须深入了解SVN来源,搜索错误跟踪器讨论,或直接询问核心团队。但是,我在下面提供了实用分析。

字符串类:不同的方法

例如,Ruby String#sizeString#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)

sizelength字符串之间没有区别。你喜欢哪一个基本上是风格问题。

答案 2 :(得分:2)

他们是完全相同的。这只是别名。

检查this article以获取更多信息,同时在count

答案 3 :(得分:0)

与其他人所说的相反,.length.size 在用法上至少存在一个差异。

.size 可用于整数,而 .length 引发 NoMethodError