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 风格版:
(sort! @states
(lambda (a b)
(let ((state_a (nth a $data_states))
(state_b (nth b $data_states))))
(cond ((> (rating state_a) (rating state_b)) -1)
((< (rating state_a) (rating state_b)) +1)
((> (restriction state_a) (restriction state_b)) -1)
((< (restriction state_a) (restriction state_b)) +1)
(t (compare a b)))))
复制代码
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1