我在使用迭代器。Ruby使用max和min进行了什么比较
如果我有这个数组:
word_array = ["hi", "bob", "how's", "it", "going"]然后我跑起来:
puts word_array.max
puts word_array.min我希望得到max的“to”或"how's“,因为它们都是五个字符的长度,或者”to“,因为它是数组中的最后一项。我希望min会返回"hi“或"it",因为它们在最短的字符串中是并列的。相反,我得到的回答是:
puts word_array.max -> it
puts word_array.min -> bobRuby是用什么来做出这个判断的?它为max选择了最短的字符串,为min选择了一个中间长度的字符串。
发布于 2016-05-24 05:29:39
实际上,你(有点)问错了问题。max和min是在Enumerable上定义的。他们对Strings一无所知。
他们使用<=>组合比较运算符(也称为“宇宙飞船”)。(注意:几乎所有比较两个对象的方法都会使用<=>操作符。这是Ruby语言中的一条通用规则,在使用别人编写的对象时可以依赖,在编写自己的对象时也应该遵守:如果要将对象相互比较,则应该实现<=>运算符。)
因此,您应该问的问题是,String#<=>与String相比如何?不幸的是,文档中的答案并不是很清楚。但是,它确实提到,如果两个字符串在这一点之前相等,则认为较短的字符串小于较长的字符串。因此,很明显,长度仅用作打破平局的标准,而不是作为主要标准(如您在问题中假设的那样)。
实际上,按字典顺序排序是最自然的事情。如果我给你一个单词列表,让你在没有给你任何标准的情况下对它们进行排序,你会按长度还是按字母顺序排序?(但是请注意,这意味着'20'小于'3'。)
发布于 2016-05-24 04:06:27
我相信它是在进行词法排序,就像字典排序一样。最大值将是字典中最远的一个。
发布于 2016-05-24 12:12:52
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"https://stackoverflow.com/questions/37399514
复制相似问题