我正在玩迭代器。什么是使用max
和min
进行Ruby比较?
如果我有这个数组:
word_array = ["hi", "bob", "how's", "it", "going"]
我跑:
puts word_array.max
puts word_array.min
我期望得到"去"或"如何""对于max
,因为他们的长度都是五个字符,或者"正在"理论上它是数组中的最后一项。我希望min
返回" hi"或者"它",因为它们与最短的字符串相关联。相反,我回来了:
puts word_array.max -> it
puts word_array.min -> bob
做出判断的Ruby测量是什么?它为max
选择了最短的字符串,为min
选择了中等长度的字符串。
答案 0 :(得分:5)
实际上,你是(有点)提出错误的问题。 max
和min
定义在Enumerable
。他们对String
没有任何了解。
他们使用<=>
组合比较运算符(又名“太空船”)。 (注意:几乎任何比较两个对象的方法都会使用<=>
运算符。这是Ruby中的一般规则,你可以在使用其他人编写的对象时依赖它。在编写自己的对象时应该遵循:如果要将对象相互比较,则应该实现<=>
运算符。)
那么,应该提出的问题是,String#<=>
如何比较String
?不幸的是,答案在文档中并不十分清楚。但是, 提到如果两个字符串相等到该点,则认为较短的字符串小于较长的字符串。因此,很明显长度仅使用 作为打破平局,不作为主要标准(正如您在问题中所假设的那样)。
实际上,词典排序是最自然的事情。如果我给你一个单词列表并要求你在不给你任何标准的情况下订购它们,你会按照长度或字母顺序排序吗? (但请注意,这意味着'20'
小于 '3'
。)
答案 1 :(得分:3)
我相信它正在进行词汇排序,就像字典顺序一样。最大值是字典中最远的一个。
答案 2 :(得分:0)
http://ruby-doc.org/core-2.1.0/Enumerable.html#method-i-max_by
ar = ['one','two','three','four','five']
ar.max_by(&:length) # => "three"