新手问题 我该如何理解这一行代码呢?arr.sort {|item1,item2| item2 <=> item1}

r9a · 2013年12月10日 · 最后由 zkai 回复于 2014年01月15日 · 3505 次阅读

codecademy 学习 Ruby 中 以下是这一整段代码

def alphabetize (arr,rev=false)
    if rev
        arr.sort {|item1,item2| item2 <=> item1}
    else
        arr.sort {|item1,item2| item1 <=> item2}
    end

end


books=["b apple","a sb","d u","c dog"]
puts "A-Z:#{alphabetize(books)}"
puts "Z-A:#{alphabetize(books,true)}"

我实在是想不明白,以下这一行代码是如何实现排序的,.sort 到底做了什么呢? arr.sort {|item1,item2| item2 <=> item1} 请赐教

你可以用 ruby 实现一下冒泡排序,应该就差不多了解了 http://zh.wikipedia.org/wiki/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F

#1 楼 @cxh116 我会用 C 语言实现这个,我也分别知道,arr.sort,|item1,item2|,item2<=>item1,这三者的含义 我不知道的是,这三个东西,怎么就变成了一个排序语句了。

sort 将两个元素给你,然后你用自己的逻辑判断两个元素谁打谁小,然后 1,-1,0,剩下的 sort 就知道怎么做了; 举个例子,假设有用户类,内有 age 属性,如果 A.age < B.age,则 A < B,这时就要自定义排序方法;跟 java 里面的 Comparealbe 接口一样,还有 JS 里面的 sort 函数也是这样实现

arr = [3,1,2]
compare_method = lambda{|item1,item2| item2 <=> item1}
arr.sort(&compare_method)

你可以把 compare_method 想像成 c 里面的函数指针变量,然后再传给 sort 方法

另外可以看看这篇博文 http://samsam.iteye.com/blog/350992

我感觉楼主是说没有明白

<=>

这个运算符。

这个运算符默认的前面的对象和后面的对象进行比较,返回 -1,1,0 以代表小于,大于或等于后面的对象。一些基本的对象提供了这个方法的实现,你也可以自己实现这个方法

#3 楼 @tyaccp_guojian @steven_yue @cxh116 我懂了,例如,当个 item2 大于 item1 的时候,item2 <=> item1,返回 1,.sort 就知道了,我想把大的排在前面。剩下的事情,就交给.sort 来完成,不要我操心了。

sort 函数根据 block 的返回值排序,就有点像 C++ 里的 sort 函数可以带一个函数指针参数一样,我这么理解的,我也是新手。

#8 楼 @zkai 那如果 block 直接替换成一个值会发生什么情况?

这个是 Ruby 最酷的,太空飞船运算符 (spaceship operator)

@jiashuji 没理解你的意思,为什么要替换成一个值呢?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号