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

Project1

 找回密码
 注册会员
搜索
楼主: DeathKing
打印 上一主题 下一主题

[讨论] Ruby/RGSS Tips 每日一更 [技术区的版聊帖?]

  [复制链接]

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
549
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

4
发表于 2010-8-27 08:39:48 | 只看该作者

2010-08-27 简略写法

p不是关键字,但是可以执行p 1正常输出1而不出错,为什么?
Ruby里调用方法时,如果不会产生歧义,则可以省略括号,使代码变得整洁美观
比如要输出一个跟RM里的用语【等级】同名的文件,可以简写成这样
  1. print IO.read Vocab.level
复制代码
这比完整写法
  1. print(IO.read(Vocab.level()))
复制代码
好看的多
但是一定要注意使用时的原则是不引起歧义,例如
  1. open File.expand_path "test.txt" , "w"
复制代码
就会出错,原因是参数"w"可能是expand_path的参数也可以是open的参数
所以必须加一层括号
  1. open File.expand_path("test.txt") , "w"
复制代码
Ruby中类似的简写除了括号之外,还有其他的,例如Hash
  1. p 1 => 2
复制代码
乍一看似乎是会Syntax,但是这一句是能执行的,输出{1 => 2}
这一特性在ruby的应用(窗口编程/网页)中使用得十分广泛

点评

只推荐用于单参数  发表于 2010-8-27 10:55
这样可能会一定程度降低可读性,使用时确保自己熟悉每个方法的参数  发表于 2010-8-27 09:08
点了回复的时候没看到嘛 >_< 结果就撞上了,不过今天入账2枚,收获颇丰啊。  发表于 2010-8-27 08:57
rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
3
发表于 2010-8-26 10:55:10 | 只看该作者
有人会问:Ruby 没有析构方法?乍一看似乎这个真没有,其实这个可以有——
define_finalizer  ObjectSpace.define_finalizer( anObject, aProc=proc() )  

Adds aProc as a finalizer, to be called when anObject is about to be destroyed.  

ObjectSpace.define_finalizer 可以为某个对象添加一个类似 C++ 析构函数的最终化处理器,如果在 initialize (类似构造函数)中调用这个方法,就能为每个实例添加一个固定的析构方法
例:

  1. class MySprite < Sprite
  2.     def initialize(viewport = nil)
  3.         super(viewport)
  4.         ObjectSpace.define_finalizer(self, proc { self. dispose })
  5.     end
  6. end
复制代码
这样一来,当 MySprite 对象被回收时,精灵资源会自动释放

点评

moy
上的就是信息技术专业...准备朝编程方向发展,主要是蛮感兴趣的说~不过糟糕的是我数学不太好于是在起跑线上就被拉后腿了T_T  发表于 2010-8-28 01:20
@moy:呵呵,慢慢来~其实我觉得如果不想主走成程序的路没必要钻研太深,还是找朋友合作比较好,就像我不可能从头学美术一样……  发表于 2010-8-27 09:16
补充:Proc 还不是 Ruby 真正的闭包,lambda 才是,详见:[url]http://bbs.66rpg.com/forum.php?mod=viewthread&tid=153979[/url]  发表于 2010-8-27 09:15
moy
不管是内容还是点评一概都雾水了@_@,我还有很长的路要走啊.....好多概念都空白呢  发表于 2010-8-27 07:25
没错,实际上就是闭包的概念  发表于 2010-8-27 01:19
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1050
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

2
 楼主| 发表于 2010-8-26 10:31:15 | 只看该作者

Sample - $game_switches和$game_variables

本帖最后由 DeathKing 于 2010-8-26 11:14 编辑

2010-08-26

$game_switches和$game_variables分别掌管游戏开关和游戏变量,他们都是数组(Array),访问使用的是[]方法,修改使用的是[]=方法。

对于$game_switches来说有效值为true(真,游戏中为开),false(假,游戏中为关);
对于$game_variables来说,理论有效值是Object(可以理解为所谓Ruby可识别的对象),但因为编辑器的限制,只能是数字(Numeric)或者字符串(String)。

将1号开关打开:$game_switches[1] = true
将5号变量归零:$game_variables[5] = 0


内幕:
事实上,$game_switches和$game_variables并不是一个Array,其实变量@data才是一个数组。
Game_Switch和Game_Variable类定义了[]和[]=两个方法来从外部访问@data而已。


补充:
紫苏:可以具象化——这两个东西实际上就是开关数组和变量数组的外壳,通过接口与外部通信
小幽的马甲:顺便,这俩的访问和修改不受数据库里上限影响——并且本来会返回nil时会返回0或false

点评

精灵看到这篇时候震精了:我一直都把他们当成数组来着(因为在Game_variables和Game_switches)里面已经初始化了所有的开关变量的说……  发表于 2010-11-29 13:56
@trentswd:确实可以当成 Ruby 的运算符重载,只须知 Ruby 的“运算符”本质上还是方法,[]、= 之类的允许出现在方法名字元中的特殊字符只是一种语法糖(即本质上还是 .[]、.= 的调用形式)   发表于 2010-8-27 07:52
moy
经常用for循环批量初始化...算是批量操作的小技巧吧,数组相对于普通hash的便利性体现之一~~  发表于 2010-8-27 07:23
我一直把这个当重载运算符来看……  发表于 2010-8-27 03:20
..... 有点高端....  发表于 2010-8-26 12:46

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-29 12:39

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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