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

Project1

 找回密码
 注册会员
搜索
楼主: 雷欧纳德
打印 上一主题 下一主题

RUBY问题收集帖

 关闭 [复制链接]

Lv1.梦旅人

月下可怜人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2005-11-23
帖子
4085

第1届短篇游戏比赛亚军

11
发表于 2006-12-20 19:25:06 | 只看该作者
以下引用灼眼的夏娜于2006-12-20 9:17:19的发言:


以下引用美兽于2006-12-20 8:58:02的发言:

yield 是什么意思,上次叶子说过一回,但似乎我理解上有出入,RGSS里这个东西一直没完全理解.




其实在ruby里,yield就是实现迭带器的,比如Array里的each什么都是通过这个来实现的。
首先,yield必须和块连用,块就是跟在方法后面的{},可以暂时理解为参数也行。比如:
def test
yield
yield
end

test{p 'test'}

会p两次 test。现在来解释下这个方法的运行:首先调用方法,然后接着到后面的{},但这里不会运行,而直接进入方法里面,也就是执行yield,而yield就是使先前的块执行,也就是{}里的内容,所以p了两次test。
然后这种:
def test
yield(1)
end
test{|i| p i}
yield带参数的,执行的时候就会把参数传递给||中间这个变量,然后执行块。

所以,现在我们来定义Array的each方法就是这样:
def each
   for i in 0...size
     yield(self)
   end
end

最后,block_given?这个可以判断方式是否带块,这样使用:
def test
if block_given?
   yield
   p 'block'
else
   p 'noblock'
end
end
test{}
test


[本贴由作者于 2006-12-20 9:35:08 最后编辑]



谢谢了.{/ll}
纵然千里外,我等雁归来。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

有事烧纸

梦石
0
星屑
154
在线时间
509 小时
注册时间
2005-10-22
帖子
6982

贵宾VX城市地图大赛冠军第1届RMTV比赛冠军第1届TG大赛冠军

12
 楼主| 发表于 2006-12-20 19:37:00 | 只看该作者
呃 ``` 那些特殊方法就素 属于某个对象的方法  比如你定义那些 po.test什么的句素属于po的
而最后那个 $mo.test 调用出错,因为 test这个其实本身就素一个定义过的方法,你在那里调用的访问权限不对,对于访问权限有private、protected、public
class A
  def o
    p :o
  end
  protected:o
end
a = A.new
a.o

至于数组那个列子,先复制到脚本里,运行工程,然后按F12重新运行,就会出现你说的那个堆栈错误的。。=v=
神隐中,偶尔诈尸
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2006-11-21
帖子
240
13
发表于 2006-12-20 20:18:08 | 只看该作者
谢谢了{/hx}
好像理解为什么会出堆栈错误了
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
2 小时
注册时间
2006-11-10
帖子
931
14
发表于 2006-12-21 07:48:00 | 只看该作者
大家都问很高深的问题{/gg}我问个白点的……正则表达式是什么{/gg}

看了F1的解释,仍然不理解orz

还有,哈希表和普通数组有什么区别{/gg}
……………………啊咧?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

风之塞尔达

梦石
0
星屑
50
在线时间
57 小时
注册时间
2005-10-22
帖子
2492

贵宾

15
发表于 2006-12-21 09:03:12 | 只看该作者
以前问过的一个问题,现在忽然又想起来还没有解决...

就是关于 ruby 数组的 结构.

在 Ruby 的数组中, 是不要预定空间长度的, 而且是可以动态的扩展的. 这个和 C 中的数组
在性质上已经不一样了. 应该更像是向量或者链表这种数据结构,但又根本不是,
因为, 在内部数据的类型上, 似乎可以不受数组内的数据必须是同一类型的数据的限制(弱类型的优势?), 即使是链表, 也要有指向特定数据类型的指针吧?


所以我对它的结构很感兴趣, 它是怎样实现的?
(不知道为什么,我载下来时运行就一直报错, 后来给我删的面目全非, 现在当当看Array.c 看不出什么明堂来 ... 缺失东西太多了... 我果然是万年小白{/ll})

贪心的某人爬走 ...  ...
在程序里延续塞尔达的传说, 在画板上勾勒塞尔达的轮廓!!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

66RPG站长

梦石
0
星屑
54
在线时间
615 小时
注册时间
2005-10-10
帖子
5734

RMVX自由创作大赛亚军第2届短篇游戏比赛亚军第5届短篇游戏比赛冠军

16
发表于 2006-12-21 09:27:25 | 只看该作者
for actor in $game_party.actors
  yield actor
end
小夏,这个如果不用yield来写,应该是什么样子呢?此外这个东西:

$game_temp.message_proc = Proc.new { @message_waiting = false }
是做什么用的?

$game_system.magic_number = $data_system.magic_number
这个东西是什么用处?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
66
在线时间
7 小时
注册时间
2005-10-22
帖子
391

贵宾

17
发表于 2006-12-21 16:45:00 | 只看该作者
一个遗留了很久的问题:
Interpreter 7的最后定义事件中脚本的解释器里,有这么个东西:
    # 返回值为 false 的情况下
    if result == false
      # 结束
      return false
    end
    # 继续
    return true


这样当在事件第一行的脚本中写xx = false的时候,result返回了false,接着这个方法也跟着返回,于是进入了无限恶性循环。
这里不知道为什么要做这个判断。尝试把这里改为返回永真,之后也没有发现运行不正常。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

有事烧纸

梦石
0
星屑
154
在线时间
509 小时
注册时间
2005-10-22
帖子
6982

贵宾VX城市地图大赛冠军第1届RMTV比赛冠军第1届TG大赛冠军

18
 楼主| 发表于 2006-12-21 21:15:53 | 只看该作者
以下引用Benavii于2006-12-20 23:48:00的发言:

大家都问很高深的问题我问个白点的……正则表达式是什么

看了F1的解释,仍然不理解orz

还有,哈希表和普通数组有什么区别

关于正则表达式:
1、首先正则表达式只是用于操作字符串的,也就是对字符串的匹配操作;
2、要明确关于正则表达式的字面值,可以用//来定义,当然,它是属于Regexp类的对象,可以使用Regexp类里的match(aString)、=~之类的方法;
3、关于匹配的规则:其实F1里把规则的说的很清楚的,偶在这就来Window_Message里的一个简单的来说说吧。
例:text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
   .1 对于gsub!这个方法当然是在String里定义的,是操作字符串的,这里就不过多解释,具体讲下后面()里的内容;
   .2 //之间的内容就素正则表达式的字面值,中间的一连串的匹配关系,\\匹配'\'这个符号本身,两条\线是因为有一条是转义的,比如\"这个;接下来是[Cc],[]并不是匹配中括号本身,而这个在F1里说过的,是进行选择匹配,也就是,只要这里是C或者是c都可以;再继续是
\[([0-9]+)\]这一串,\[是经过\号转义的匹配左中括号,继续是中间小括号里的内容这个()并不是要匹配的内容,而是一个后向引用,呃 `` 这又素啥,就是把这个括号里匹配到的部分记录在$1这个变量中,当然对应的第二个括号里匹配到的内容就放在$2里,[0-9]和[Cc]相同,只要是0-9之间的数字都可以匹配,后面一个+号,是匹配的个数,也就是说可以是0-9中的一个或者多个,比如5或者65或者253等都行。最后是\],也就是右中括号。汗,这么乱,那来整理下需要匹配的顺序:
1.\\ ; 2.C或者c都可 ; 3.[号 ; 4.0-9中的数字1个或者多个,并把他记录到$1里 ; 5. ]号
那么,下面这些就是可以的 \\c[7] 、\\C[12] 、\\c[0] 等
下面的是不符合要求的  \\cc[5]、\\[5]等
好了,正则表达式大概就介绍这么,至于其中的许多方法可以参考正则表达式的类。


关于数组和hash:
要说区别,其实在ruby唯一的区别就是 取值的主键不同,数组通过整数取值,hash可以用任何键值进行取值,其他的array和hash就没区别了。


先闪去上课。。。呃 。。。
神隐中,偶尔诈尸
回复 支持 反对

使用道具 举报

Lv1.梦旅人

有事烧纸

梦石
0
星屑
154
在线时间
509 小时
注册时间
2005-10-22
帖子
6982

贵宾VX城市地图大赛冠军第1届RMTV比赛冠军第1届TG大赛冠军

19
 楼主| 发表于 2006-12-21 21:28:07 | 只看该作者
以下引用link006007于2006-12-21 1:03:12的发言:

以前问过的一个问题,现在忽然又想起来还没有解决...

就是关于 ruby 数组的 结构.

在 Ruby 的数组中, 是不要预定空间长度的, 而且是可以动态的扩展的. 这个和 C 中的数组
在性质上已经不一样了. 应该更像是向量或者链表这种数据结构,但又根本不是,
因为, 在内部数据的类型上, 似乎可以不受数组内的数据必须是同一类型的数据的限制(弱类型的优势?), 即使是链表, 也要有指向特定数据类型的指针吧?


所以我对它的结构很感兴趣, 它是怎样实现的?
(不知道为什么,我载下来时运行就一直报错, 后来给我删的面目全非, 现在当当看Array.c 看不出什么明堂来 ... 缺失东西太多了... 我果然是万年小白)

贪心的某人爬走 ...  ...



[本贴由作者于 2006-12-21 1:23:05 最后编辑]



呃 `` 这个  

1、ruby是完全对象,java都不是完全对象,最明显的java的1、2、3之类的不是对象,而在ruby中则是;
2、ruby数组中保存的对象的引用集合,可以通过这个引用索引到该对象;
3、其实数组和hash是相同的,只是hash保存的是主键和键值的引用。

呃 ``` 偶理解到此,要问在c语言中怎么扩充的array,偶也米看。。。- -b
神隐中,偶尔诈尸
回复 支持 反对

使用道具 举报

Lv1.梦旅人

有事烧纸

梦石
0
星屑
154
在线时间
509 小时
注册时间
2005-10-22
帖子
6982

贵宾VX城市地图大赛冠军第1届RMTV比赛冠军第1届TG大赛冠军

20
 楼主| 发表于 2006-12-22 00:08:56 | 只看该作者
以下引用柳柳于2006-12-21 1:27:25的发言:

for actor in $game_party.actors
yield actor
end
小夏,这个如果不用yield来写,应该是什么样子呢?此外这个东西:

$game_temp.message_proc = Proc.new { @message_waiting = false }
是做什么用的?

$game_system.magic_number = $data_system.magic_number
这个东西是什么用处?

1、yield
def orz
  for actor in $game_party.actors
    yield actor
  end
end

orz{|actor| p actor.name}

这个和

for actor in $game_party.actors
  p actor.name
end

有区别么... - -b
显然后面那个更方便..-v-

所以yield一般用在实现回调的地方...

2、Proc
这是过程对象的类,用于创建过程对象
$game_temp.message_proc = Proc.new { @message_waiting = false }
后面带了一个块,当然那个块不会被执行,和yield那里一样,只要在调用了call方法之后才执行块里的内容,也就是在对话完毕后调用$game_temp.message_proc.call,所以
@message_waiting = false了,可以用于在其他地方改变内部变量呢,当然块也可以带参数的
a = Proc.new{|orz| p orz}
a.call("orz") ... - -b

3、$game_system.magic_number = $data_system.magic_number这个东西在游戏完成后发布了就米用了的,只是还在制作的时候才会有作用,工程只要被进行修改之后$data_system.magic_number的值就会被改变,所以,主要是用于在制作过程中调式的时候比如修改了主角初始位置坐标或者地图什么的就会重新加载地图。。。- -b
神隐中,偶尔诈尸
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-22 01:17

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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