Project1

标题: 看脚本时发现的问题:关于块和“<=>” [打印本页]

作者: 醉昭    时间: 2010-8-20 16:27
提示: 作者被禁止或删除 内容自动屏蔽
作者: DeathKing    时间: 2010-8-20 16:34
<=>是方法,每个类都不一样(存疑),大多数情况下用作 == ,不过好像有自己的一套规则。

+1 和-1 是设定返回值,Ruby规定如果没用用return来设定返回值,那么就返回最后一次的那个值。这里等同于 return 1 ; reuturn -1

至于块么,可以理解为是一个匿名的函数(方法)。

求楼下补充,特别是老板。(逃离玩游戏去,所以写的不是很详细。)
作者: 逸豫    时间: 2010-8-20 17:05
本帖最后由 逸豫 于 2010-8-20 17:10 编辑

关于语句块 闭包的详细说明?http://hi.baidu.com/chendeping/b ... ea831863279842.html
记得我买过一本Learning Ruby的书里面说过这个问题……可是现在不在手上……

恩<=>貌似不同的类有不同的方法,大概就是 大于返回1 等于返回0 小于返回-1

根据我的那个连接来看:那个1 0 -1那个,不应该理解为return 这是方法的返回…… 应该理解为next -1这样?
作者: dbshy    时间: 2010-8-20 18:24
本帖最后由 dbshy 于 2010-8-20 18:26 编辑

块的理解 搜索 荷西 block的真意
我理论不行 理解不透彻 就不说了

另外 <=> 操作符
返回 1 0 -1

首先你必须理解sort的用法
http://rpg.blue/forum.php?mod=vi ... 2141&highlight=

然后对<=> 的理解

对数组内容进行排序。若带块调用时,将把 2 个参数传给块,然后使用块的计算结果进行比较。若没有块时,使用 <=> 运算符进行比较。sort! 的对数组单元的排序过程具有破环性。
p [1,2,3].sort{|a,b| a <=> b}
=> [1,2,3]
p [1,2,3].sort{ - 1 }
=> [1,2,3]

p [1,2,3].sort{|a,b| b <=> a}
=> [3,2,1]
p [1,2,3].sort{ 1 }
=> [3,2,1]
将例子结和sort的说明 应该看的懂吧 = =
作者: 紫苏    时间: 2010-8-21 00:18
<=> 是 Ruby 继承自 Perl 的 经典比较运算符,和 C 的 strcmp,Java 和 C# 的 compareTo,都是一个概念;直接写一个数字作为块的返回值是函数式编程泛型的风格,与之相对的是 return +1——命令式编程风格
作者: DeathKing    时间: 2010-8-26 13:03
回复 逸豫 的帖子


    记得有这么一句(p205, Ruby on Rails 简介)
为我们程序员带来快快乐乐、没有胃溃疡的生活

我呆住了 O_o
作者: 紫苏    时间: 2010-8-26 15:07
Proc.new 产生的“过程”并不能在创建时的上下文消失后继续使用,所以并不满足闭包“随时调用满足一定功能”的特性;与之相对的是 Kernel.lambda,这家伙产生的是真·闭包

另外,return 在 Proc.new 里并不表示从 Proc 中返回,而是当做在 Proc.new 创建时的上下文中 return,如果创建时不是在方法内部,就会发生异常(LocalJumpError);而在 lambda 里 return 则是从闭包返回

其实 Ruby 1.8 里关于闭包还是有个问题——Kernel.proc 的文档说的是和 Proc.new 同等,其实却是和 lambda 同等,显然是一个失误,可喜的是在 1.9 里修复了,可悲的是 RM 用的是 1.8,用的时候如果涉及到上下文和 return,就需要注意下

next 则无论是在哪种块中都是从块中返回;break 只能在 lambda 中使用,也是从闭包返回

另附一个蛋疼的这段代码的 Lisp 风格版:
  1. (sort! @states
  2.        (lambda (a b)
  3.         (let ((state_a (nth a $data_states))
  4.               (state_b (nth b $data_states))))
  5.         (cond ((> (rating state_a) (rating state_b)) -1)               
  6.               ((< (rating state_a) (rating state_b)) +1)
  7.               ((> (restriction state_a) (restriction state_b)) -1)
  8.               ((< (restriction state_a) (restriction state_b)) +1)
  9.               (t (compare a b)))))
复制代码





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1