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

Project1

 找回密码
 注册会员
搜索
12
返回列表 发新帖
楼主: DeathKing
打印 上一主题 下一主题

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

  [复制链接]

Lv3.寻梦者

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

贵宾

7
 楼主| 发表于 2010-10-24 08:12:48 | 显示全部楼层
本帖最后由 DeathKing 于 2010-10-24 12:23 编辑

欢欢乐乐来循环

经典的for语句:
  1. for i in 0..100
  2.   p "i count #{i}"
  3. end
复制代码
换个马甲如何?
  1. (0..100).each do |i|
  2.   p "i count #{i}"
  3. end
复制代码
原来是重复101次!
  1. 101.times do |i|
  2.   p "i count #{i}"
  3. end
复制代码
想想,是从0数到100:
  1. 0.upto(100) do |i|
  2.   p "i count #{i}"
  3. end
复制代码
我愿意倒着数:
  1. 100.downto(0) do |i|
  2.   p "i count #{i}"
  3. end
复制代码
还没数到100就别停下来
  1. i = 0
  2. while i <= 100
  3.   p "i count #{i}"
  4.   i += 1
  5. end
复制代码
似乎这个更清晰:
  1. i = 0
  2. until i == 101
  3.   p "i count #{i}"
  4.   i += 1
  5. end
复制代码
他们都是循环的快速通道:
for, while, until

Range#each
Integer#times
Integer#upto
Integer#downto
String#upto
String#downto

点评

死循环啊——比如这个RGSS文件【Ruby也可以完成,只不过比较麻烦】 Game.exe exit 多好啊~  发表于 2010-11-9 19:22
moy
goto是在太坏了...  发表于 2010-10-25 08:19
某個integer寫錯了O O  发表于 2010-10-24 12:08
让我们欢乐的goto吧囧  发表于 2010-10-24 09:50
其实还有0.step(100) {|i| p "i count#{i}"} ,顺便那个until里的=应该是==……  发表于 2010-10-24 09:06

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

使用道具 举报

Lv3.寻梦者

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

贵宾

6
 楼主| 发表于 2010-10-11 12:45:16 | 显示全部楼层


Kernel、Object、Module、Class间的关系。

简洁、明了、没有胃溃疡。

点评

其实匿名类都是不会被 #superclass 获取到的,不只是 Kernel 的 mixin 而已  发表于 2010-10-11 13:58

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

使用道具 举报

Lv3.寻梦者

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

贵宾

5
 楼主| 发表于 2010-10-5 07:12:50 | 显示全部楼层
本帖最后由 DeathKing 于 2010-10-5 07:14 编辑

本来6点就起来了,但是打了一会儿酱油。

  1. ARGV << "a.c"
  2. print while gets
复制代码
gets 是 Kernel 中的方法,用于取得 ARGV 中的各行内容。将文件名 a.c 放入 ARGV 中,让 gets 不断取回(直到到文件尾)。

还能快点么?
  1. print IO.read("a.c")
复制代码

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

使用道具 举报

Lv3.寻梦者

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

贵宾

4
 楼主| 发表于 2010-8-31 00:02:57 | 显示全部楼层

2010-08-31

本帖最后由 DeathKing 于 2010-8-31 00:37 编辑

三元表达式、三元运算符(Ternary Operator

  平常接触的if控制结构都是这样的:
  1. if condition
  2.   exp1
  3. else
  4.   exp2
  5. end
复制代码
不过当exp只有一句的时候,这样看起来会十分的占地方,所以就有了下面这种简写为一排的方式:
  1. if condition then exp1 else exp2 end
复制代码
不过这样看起来也有很大一堆,还有没有更简单、优雅的写法呢?当然是有的,Ruby继承了C的三元运算符(Ternary Operator),上面的表达式会被替换成这样:
  1. condition ? exp1 : exp2
复制代码
实质上,首先会计算condition的值,为真的话就执行exp1,否则就就只exp2。不过要注意的是,三元运算符的优先级比=(赋值运算符)高,所以下面的做法是完全可行的:
  1. foo = true ? 1 : 0
  2. p foo #=> 1
复制代码
如果说你是Visual Basic程序员,你会发现,三元运算符就和IIf函数类似。

点评

vb 的 iif 函数可不是惰性求值。  发表于 2011-8-21 00:35
三目运算符是个好东西~恩~ 而且特别喜欢ruby可以把if或者unless写在表达式后面的写法  发表于 2010-9-2 13:59
= =这种写法还不如同行if..else简洁  发表于 2010-8-31 13:55
还有个写法:condition and (expr1 or true) or expr2,纯粹是玩弄逻辑算术及其短路特性 =v=  发表于 2010-8-31 00:15

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

使用道具 举报

Lv3.寻梦者

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

贵宾

3
 楼主| 发表于 2010-8-27 08:43:26 | 显示全部楼层

有关方法名的一些俗成约定

本帖最后由 DeathKing 于 2010-8-29 07:19 编辑

2010-08-28

昨天进行过一次讨论:http://rpg.blue/thread-154899-1-1.html
既然抢到了今天的帖子,那么就借花献佛。

Ruby中的方法名有一定的俗成的约定,下面列出了这些约定,不过,这不是强制性必须遵守的!

以 = 号结尾的方法通常是setter,会为同名实变量设定值;
以 ? 号结尾的方法返回的是一个所谓的布林值,也就是true或者false;
以 ! 号结尾的方法表示该方法具有破坏性,所以要小心操作。

一些例子:
  • 由元编程方法 attr_writer :methodattr_accessor :method 建立的 method= 方法就会为 @method 实变量赋值;
  • Object 类提供的 is_a? 方法返回 true 或者false ,来判断对象是否是一个类的实例,如: 1.is_a? Fixnum #=> true
  • String 类提供的gsub! 方法比较常见(Window_Message 大多用这个方法处理),它就具有破坏性,直接在源对象上操作;

关于破坏性与非破坏性的比较:

  1. ary = [1,3,5,7,9,2,4,6,8,10]

  2. ary.sort #=> [1,2,3,4,5,6,7,8,9,10]
  3. p ary    #=> [1,3,5,7,9,2,4,6,8,10]

  4. ary.sort! #=> [1,2,3,4,5,6,7,8,9,10]
  5. p ary     #=> [1,2,3,4,5,6,7,8,9,10]
复制代码

点评

布林?布尔?  发表于 2010-8-30 14:38
带 `=' 的函数也可以叫 modifier、mutator,带 `?' 的则是 predicate  发表于 2010-8-29 00:40
我错了,原来我没看清楚规则……昨天看成一人每天限回复1贴了  发表于 2010-8-27 09:23
DK你来晚了  发表于 2010-8-27 08:53

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

使用道具 举报

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-5-2 17:28

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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