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

Project1

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

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

  [复制链接]

Lv3.寻梦者

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

贵宾

32
 楼主| 发表于 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的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
31
发表于 2010-10-4 04:27:32 | 只看该作者
Ruby 1.9 支持一级函数,匿名闭包也成了语言的基本元素之一。用户可以通过 `->' 这个符号来快速写出一个 lambda 函数:

  1. a = ->(a, b) { a * b }
  2. p a.(3, 4)    # 12
复制代码
而这等同于 Ruby 1.8 的:

  1. a = lambda { |a, b| a * b }
  2. p a.call(3, 4)    # 12
复制代码
相比之下,新的 lambda 语法看起更像函数,也更接近 Lisp 风格的闭包。
前面的 a.(3, 4) 也是一个新的语法糖,它使得我们可以省略掉 `Proc#call'(当然,它底层调用的还是 call,所以它只是一个语法糖)。
Matz 为什么要用 `->' 这个符号来表示 lambda 函数?Ruby 社区一致认为内置运算符应该只使用 7 位 ASCII 以内的字符,所以他不能直接用 ` λ' 这个并不在 7 位 ASCII 中的字符。按照他的说法,`->' 这个符号会让人想起 lambda 的原型 ` λ',所以就选用了它。不要和 C/C++ 的成员、指针运算符弄混淆!
回复 支持 反对

使用道具 举报

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
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

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

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

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

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

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

使用道具 举报

Lv2.观梦者

旅之愚者

梦石
0
星屑
255
在线时间
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
回复 支持 反对

使用道具 举报

Lv2.观梦者

旅之愚者

梦石
0
星屑
255
在线时间
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
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

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

使用道具 举报

Lv3.寻梦者

酱油的

梦石
0
星屑
1015
在线时间
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
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-2 22:22

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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