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

Project1

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

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

  [复制链接]

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
21
发表于 2010-9-23 07:35:35 | 只看该作者
其实话题不少,但两百字能说清楚的比较少,还是每天来打一瓶酱油好了 <--- 这是闲话

今天来说一下跳出两层以上循环的方法,为了节省字数每天只说一种方法——
1、使用内置的异常机制,在多层循环内部抛出一个异常,在多层循环外捕获这个异常即可:

  1. begin
  2.   for i in 1..10
  3.     for j in i..10
  4.         p i, j
  5.         raise if i + j > 12 # 跳出两层循环
  6.     end
  7.   end
  8. rescue
  9.   p '跳出了循环'
  10. end
复制代码

点评

to moy:catch(:symbol) do;xxxx;throw :symbol;end。  发表于 2010-9-23 22:59
moy
强烈要求看到其他方法...  发表于 2010-9-23 19:12

评分

参与人数 1星屑 +1776 收起 理由
DeathKing + 1776 200字是软规定,卓越贡献者的中秋礼包。 ...

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
22
发表于 2010-9-24 06:50:17 | 只看该作者
本帖最后由 紫苏 于 2010-9-24 07:01 编辑

承接二十一楼:
2、在当前局部范围内使用闭包块进行跳转:
  1. lambda {
  2.   for i in 1..10
  3.     for j in i..10
  4.         p i, j
  5.         return if i + j > 12 # 跳出两层循环
  6.     end
  7.   end
  8. }.call
  9. p '跳出了循环'
复制代码
当然,如果你的循环过程独立于其它流程,那么用方法也是可以的;否则由于 Ruby 1.8 的方法没有进行上下文绑定(而闭包则保持了闭包被创建时那一刻的绑定),在方法内部是无法引用外部的变量的,因为它们分属于不同的栈帧,互不可见(正因如此,方法内的变量才被称为局部变量)
回复 支持 反对

使用道具 举报

Lv3.寻梦者

酱油的

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

贵宾

23
发表于 2010-9-25 08:07:24 | 只看该作者
今天沒有人搶耶?那麼就由我來主持吧XD
Ruby 的事情說的人多了,就來談談RGSS的東西~

在RM當中,圖片的緩存是由 Cache 模板處理的。它的實現機制是用名為@cache的hash表記錄bitmap和原路徑的對應關系,從而使得不需要重複生成 bitmap (因為這個東西的生成代價是很高的)。
這是最核心內容:

  1.   def self.load_bitmap(path)
  2.     if not @cache.include?(path) or @cache[path].disposed?
  3.       @cache[path] = Bitmap.new(path)
  4.     end
  5.     return @cache[path]
  6.   end
复制代码
這樣做的優點是可以減少讀取文件次數,從而提高程序速度;缺點是占用內存太多,低配置機械跑不動。而值得注意的是,當你對一個bitmap進行繪畫處理時,操作會直接影響到bitmap的實例,因此大家不要在存入 cache 的 bitmap 上面寫字和作畫哦。

除開頭和結尾的字數不算,剛好200XD

点评

等 RGE 2.0 下来了参考其 Cache 即可 o.o  发表于 2010-9-29 06:18
求ruby实现  发表于 2010-9-26 16:42
Cache 设计确实有问题,没有容量限制 o.o 如果要重新设计一个智能的 Cache 的话,首先要分析当前进程可用的物理内存,再用一些 Cache 算法来模拟 CPU Cache  发表于 2010-9-25 11:06
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

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

使用道具 举报

Lv2.观梦者

旅之愚者

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

贵宾

25
发表于 2010-9-26 17:52:26 | 只看该作者
本帖最后由 六祈 于 2010-9-26 17:57 编辑

每日一酱油【这行不算字】

有关map的一个小技巧

【技术基础:实参前添加&可以隐式调用to_proc方法】
  1. class Symbol
  2. def to_proc
  3. proc {|obj , *args| obj.send(self , *args)}
  4. end
  5. end
复制代码
上面的代码定义了Symbol对象的to_proc方法
然后~赋值一个字符串数组
  1. words = %w(hello kitty not world)
复制代码
然后是重点:
  1. list = words.map(&:capitalize)
复制代码
ok,得到了第一个字母大写的字符串数组了

点评

优雅还是不错的  发表于 2010-9-29 16:32
moy
自己写的代码都很有可能忘记..何况别人写的...对于合作开发而言,越是优雅的代码越容易造成阅读和理解困难无误.  发表于 2010-9-27 16:31
代碼還是統一的好,為了某個功能而特別開辟一種寫法,對于二次開發很不利  发表于 2010-9-27 10:36
moy
代码越是优雅就代表着对于别人来说识别代价越高,以及返工时自己越是欲哭无泪...  发表于 2010-9-27 06:21
to【紫苏】and【小瞳】:数据量不大的话,效率应该不会差很多,然后代码会看起来清晰很多【其实愚者就是一个追求代码优雅的怪异存在】  发表于 2010-9-26 23:09
回复 支持 反对

使用道具 举报

Lv2.观梦者

旅之愚者

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

贵宾

26
发表于 2010-9-27 02:20:57 | 只看该作者
本帖最后由 六祈 于 2010-9-27 18:28 编辑

继续每日一酱油~~~【这行依然不算字】

今日话题:你真的会用[]吗?
String#[]

国际惯例,先赋值一个模范变量
  1. str = "hello , world"
复制代码
[start,range]
  1. p str[0,5]
复制代码
这个会打印从索引0开始,取到的5个字符

[start..end]
  1. p str[0..4]
复制代码
这个会打印索引0到索引4【包含】的字符串

[String]
  1. p str["hell"]
复制代码
如果字符串能匹配hell的话会打印之

[integer]
  1. p str[0]
复制代码
这个会打印一个数字哟~要谨慎使用,如果想要打印索引0的字符,要使用
  1. p str[0].chr
复制代码
哟~

[Regexp]
  1. p str[/h.+?o/]
复制代码
会打印匹配正则的字符串部分,结果显示hello

点评

str[0]会返回整数的情况在ruby 1.9中得到了改善,现在可以用str[0]取得第0位的字符了  发表于 2010-9-29 16:31
p str[/h.+?o/]才会显示hello吧= =  发表于 2010-9-27 17:49
好高深啊  发表于 2010-9-27 11:57
值得注意的是在ruby中,默認情況,一個漢字占三個字節(utf8),而不是常見的兩個字節(GB2312)。一開始時老是搞錯咧Orz  发表于 2010-9-27 10:31
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

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

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

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

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
30
发表于 2010-10-3 01:23:03 | 只看该作者
由于在不远的(希望...)将来, RGE 2.0 会嵌入 Ruby 1.9 作为脚本语言,它解决了很多 1.8 潜在的性能问题(当然,由于多出来的很多新东西,比如枚举器,也在某些方面降低了性能),我认为在这里讨论一下 1.9 的新东西也是有意义的。

Ruby 1.9 的类继承图表根部不再是 Object,而是一个叫 BasicObject 的类。为什么需要这个类?须知 Object 虽然处在底层,但也是捆绑了大量方法的庞然大物,它包含了在 Kernel 中定义的所有基本对象的实例方法。我们有时可能希望使用一个货真价实的“老子”,没有从任何人那里继承任何东西,以节省对象虚表所占据的空间,这就是 BasicObject 被引入的主要目的。它只包含了仅有的几个基本方法,没有包含克隆、污染、安全、冻结、反射、动态求值等五花八门的对象功能。
  1. p BasicObject.instance_methods(false)
复制代码
这一行是打印出所有 BasicObject 定义的实例方法,输出:
[:==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__]
而如果我们:
  1. p Object.instance_methods(true)
复制代码
则输出:
  1. [:nil?, :===, :=~, :!~, :eql?, :class, :clone, :dup, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :frozen?, :to_s, :inspect, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :extend, :display, :method, :public_method, :define_singleton_method, :hash, :__id__, :object_id, :to_enum, :enum_for, :gem, :==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__]
复制代码
可见差距。后面之所以传递了一个 true,是为了同时输出从父类继承过来的方法,因为 Object 多出来的这些方法来自 Kernel Mix-in(换言之,这些方法本身定义在 Kernel 中),所以实际上 Object 有一个匿名父类,存在于 Object 和 BasicObject 之间。

在 Ruby 1.8 中,我们可以通过 undef 去实现这样的一个 BlankSlate (白板)类:
  1. class BlankSlate
  2.   instance_methods.each { |m| undef_method m }
  3. end

  4. p BlankSlate.instance_methods
复制代码
当然,有些方法你还是想保留的,比如 object_id、__send__(实际上如果你 undef 了这两个最基本的方法,Ruby 解释器会给你警告:
warning: undefining `object_id' may cause serious problem
warning: undefining `__send__' may cause serious problem

但是这仍然是一种亡羊补牢的做法。我们希望从一开始就有这样的“白板”,于是就有了 BasicObject。

点评

2拖坑中...最近夏娜不见人影,另外也没更新本体  发表于 2010-10-3 11:42
Programming Ruby 1.9 版前几天到手了,这几天就打算每天看一点新内容分享上来。  发表于 2010-10-3 09:32
据说Programming Ruby第三版有Ruby1.9的内容,可惜没有中译本= =顺便RGE2啥时候才能出【望天】  发表于 2010-10-3 09:30
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-6-9 06:56

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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