设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 10939|回复: 16
打印 上一主题 下一主题

[原创发布] 你真的会用数组迭代吗?

[复制链接]

Lv1.梦旅人

旅之愚者

梦石
0
星屑
240
在线时间
812 小时
注册时间
2007-7-28
帖子
2148

贵宾

跳转到指定楼层
1
发表于 2010-9-24 22:15:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 六祈 于 2010-9-24 23:32 编辑

众所周知,数组最简单的迭代就是for..in..语句,包括RGSS中默认的脚本。

所以愚者想和大家分享的是,怎么样让你的迭代写的更好看~
请诸位往下看

先赋值一个数组:
  1. arr = [1 , 2, 3, 4, 5, 6 , 7 , 8 , 9 , 10]
复制代码
这句有一种简单的写法:
  1. arr = [*1..8]
复制代码
*表示将一个范围【Range】或者数组【Array】展开

Array#each
each方法是一切迭代的基础
任务:打印所有元素
  1. arr.each{|e| p e}
复制代码
就可以实现
  1. for e in arr
  2. p e
  3. end
复制代码
一样的功能

查看F1就可以知道,RGSS有一个内置模块叫Enumerable,定义过each方法的类混入Enumerable模块后就可以使用以下众多方法:
1、find
任务:找出arr中第一个3的倍数
  1. x = arr.find{|e| e % 3 == 0}
复制代码
代码块的语句是一个布尔表达式,find方法会返回第一个使代码块表达式为真的元素,【detect方法是find方法的别名】

2、find_all
任务:找出arr中所有奇数
  1. arr_x = arr.find_all{|e| e % 2 == 1}
复制代码
代码块的语句是一个布尔表达式,find_all方法会返回所有使表达式为真的元素的数组【select是find_all方法的别名,另外reject是select的反义词,收集布尔值为假的元素】

3、collect
任务:得到2、4、6、8……16这些数【即arr元素的2倍】
  1. arr2 = arr.collect{|e| e * 2}
复制代码
代码块的语句的返回值作为新数组的元素被收集【map是collect方法的别名】

4、each_index和each_with_index
注意这两个方法与each类似,each_index迭代的参数为索引值【从0开始】,each_with_index迭代有两个参数,第一个为元素,第二个为索引

5、any?
任务:arr中是否存在一个大于10的数
  1. exist = arr.any?{|e| e > 10}
复制代码
代码块依然是布尔表达式,只要有一个元素使其为真,就返回真【与any?类似还有一个all?方法,all?方法只有所有元素均为真时才会返回真】

6、grep
任务:只对4、5、6三个元素迭代,并分别打印它们的三倍
  1. arr.collect{|e| e.to_s}.grep(/[456]/){|e| p(e * 3)}
复制代码
grep方法需要一个正则表达式参数,后面的代码块只迭代匹配该正则的元素,返回一个以代码块返回值为元素的数组,可以理解为一个带过滤器的collect方法。上述代码结果为打印出12,15和18,并返回一个数组,数组包含3个nil【p方法返回nil值】

7、inject
任务:计算8的阶乘【即arr中所有元素相乘】
  1. total = arr.inject(1){|tot , e| tot *= e}
复制代码
inject方法需要一个参数,作为初始值【如果没有,则以第一个元素作为初始值,从第二个元素开始迭代】,代码块需要两个参数,第一个参数是叠加值,第二个参数是迭代的元素,迭代完成后会返回叠加值

8、sort和sort_by
任务:怎么样从一堆事件中找到x坐标与主角x坐标差最小的事件
http://rpg.blue/forum.php?mod=vi ... p;page=1#pid1529709
被迭代数组:$game_map.events.values【events是哈希,它的键是事件id,值为事件对象】
首先用sort_by方法排序【该方法会根据代码块计算结果的大小排序,小的放在前面】
  1. sorted_events = $game_map.events.values.sort_by{|event| (event.x - $game_player.x).abs}
复制代码
ok,完成排序,然后取出sorted_events数组第一个元素就ok了
  1. event = sorted_events[0]
复制代码
好啦~今天就先讲到这里,欢迎大家补充更多好玩的方法哟~【尤其是德斯金和purple苏大人,还有II弟】

评分

参与人数 2星屑 +702 收起 理由
后知后觉 + 700 脚本教程.鼓励III
熊猫 + 2 迭代..以前没听过,帮我扫盲了。 ...

查看全部评分

Lv2.观梦者

无节操

梦石
0
星屑
607
在线时间
795 小时
注册时间
2009-2-6
帖子
3939

开拓者贵宾

2
发表于 2010-9-24 22:28:51 | 只看该作者
咱不会用数组迭代{:nm_3:}

点评

moy
实话嘛~我的积累太少了  发表于 2010-9-24 23:15
moy老师神一般的乱入喵~~~  发表于 2010-9-24 22:33
Brandnew day, Brandnew Life
                              实在  中
暂为素材区版主,版其  琢磨
应援一下~
RPG制作大师授权素材推广计划
回复 支持 反对

使用道具 举报

Lv3.寻梦者

宛若

梦石
0
星屑
1558
在线时间
526 小时
注册时间
2007-8-19
帖子
1493

极短24参与开拓者

3
发表于 2010-9-24 23:22:00 | 只看该作者
本帖最后由 逸豫 于 2010-9-24 23:31 编辑
  1. arr = [1 , 2, 3, 4, 5, 6 , 7 , 8 , 9 , 10]
  2. arr.grep(/[456]/){|e| p (e * 3)}
复制代码
Ruby 1.8.6解释器 出现警告warning: don't put space before argument parentheses
同时无输出 求解
1、p后面不需要空格
2、貌似正则表达式只匹配字符串?

点评

moy
提到优先级总是想起著名的 i++和++i ....  发表于 2010-9-24 23:43
我第一眼看到这个错误为虾米想到了内存存储空间 - - 英文不好的泪目- -  发表于 2010-9-24 23:34
看英文就看出来了…因为一般用p喜欢在参数前面加空格,而这里用了e * 3,怕出现优先级问题又使用了()…  发表于 2010-9-24 23:31
上网查了下……这个警告的出现表示汝在方法名和()中间打上空格了- -|||大囧  发表于 2010-9-24 23:30
囧了一记,以后不会再用正则来匹配数字了个囧  发表于 2010-9-24 23:30
[url=http://rpg.blue/thread-219730-1-1.html]http://unhero.sinaapp.com/wi.php[/url]
[color=Red]如你所见这是个死坑,没错这就是打我的脸用的[/color]
回复 支持 反对

使用道具 举报

Lv3.寻梦者

酱油的

梦石
0
星屑
970
在线时间
2161 小时
注册时间
2007-12-22
帖子
3271

贵宾

4
发表于 2010-9-25 01:20:59 | 只看该作者
迭代的方法還有很多呢~有 #map #reverse_each等等,以前就秘密地發布過這東西耶~

点评

既然是我在六R寫的主題,那麼就一定能在那裡找到哦~呵呵呵~  发表于 2010-9-25 12:23
求真相~求传送门~  发表于 2010-9-25 11:35
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
39645
在线时间
7484 小时
注册时间
2009-7-6
帖子
13483

开拓者贵宾

5
发表于 2010-9-25 06:55:00 | 只看该作者
学到EACH用法了。

第一次看到6祈大人在这里发帖。
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv3.寻梦者

小柯的徒弟

梦石
0
星屑
1435
在线时间
1157 小时
注册时间
2008-5-24
帖子
3085

贵宾

6
发表于 2010-9-25 07:05:44 | 只看该作者
><居然没叫我来抢沙发……

支持支持~~话说我是最先听小祈酱老师讲课的~~自豪~~

点评

小旅昨天不在喵~话说今天上课么?  发表于 2010-9-25 11:35
回复 支持 反对

使用道具 举报

Lv1.梦旅人

不画画就死星人

梦石
0
星屑
164
在线时间
1818 小时
注册时间
2007-6-14
帖子
3219
7
发表于 2010-9-25 08:47:41 | 只看该作者
{:nm_9:}来膜拜各位脚本大神~
渣绘关注慎重
[url=http://www.pixiv.net/member.php?id=1160389][color=DimGray]http://www.pixiv.net/member.php?id=1160389[/color][/url]
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
21 小时
注册时间
2007-7-3
帖子
573
8
发表于 2010-9-25 10:46:40 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
9
发表于 2010-9-25 10:59:00 | 只看该作者
讲的很好,很多方法都没用过 o.o
其实这种迭代器的思想起源自 Lisp 的抽象列表函数,比如 mapchar 这个经典 Lisp 函数就是对列表中每一个元素进行迭代,等同于 Ruby 的 each,具体的操作在编译时是抽象的,直到运行时传递了实际的 lambda 匿名函数(等同于Ruby 的块)才具象化,不过区别是 Lisp 风格的语言,其基本数据结构是链表而不是数组,所以还可以有 fold 等抽象函数进行列表结构递归的抽象化
对了,最后一个 sort_by 用来排序是很不错,但实际上如果只是想找最小值,那排序就有点浪费了,其实完全可以遍历一次数组,找出最小值,这样只需要 O(n),而排序是 O(n log n)

点评

昨天看到一本书里说,collect是SmallTalk的风格,而map是Lisp的风格,Ruby果然集了很多语言的特点……  发表于 2010-9-27 22:40
……紫苏大人如何得知?【势不两立】从何而来?  发表于 2010-9-25 12:40
sort_by 其實是配合 pop 用的  发表于 2010-9-25 12:25
另附吐槽:我勒个去原来六祈你是上海交通大学的,我们势不两立!!  发表于 2010-9-25 11:45
回复 支持 反对

使用道具 举报

Lv1.梦旅人

尽头

梦石
0
星屑
119
在线时间
278 小时
注册时间
2010-6-20
帖子
1280
10
发表于 2010-9-25 12:41:12 | 只看该作者
不看F1的路过.........
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-24 16:58

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表