查看: 58|回复: 0

[转载发布] 你真的会用数组迭代吗?

[复制链接]
  • TA的每日心情
    开心
    2024-5-10 09:55
  • 签到天数: 37 天

    连续签到: 3 天

    [LV.5]常住居民I

    2028

    主题

    32

    回帖

    7260

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    0
    卡币
    5184
    OK点
    16
    积分
    7260
    发表于 同元一千年八月三日(秋) | 显示全部楼层 |阅读模式
    众所周知,数组最简单的迭代就是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 arrp eend复制代码
    复制代码
    一样的功能

    查看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弟】
                 本帖来自P1论坛作者六祈,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=157153  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
    天天去同能,天天有童年!
    回复 论坛版权

    使用道具 举报

    ahome_bigavatar:guest
    ahome_bigavatar:welcomelogin
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2024-5-21 00:34 , Processed in 0.051540 second(s), 43 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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