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

Project1

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

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

  [复制链接]

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
34
发表于 2010-10-7 07:55:13 | 只看该作者
Ruby 1.9 支持带缺省值的参数出现在不带缺省值的参数之前,而 Ruby 1.8 及其它很多支持参数缺省值的语言都要求带缺省值的参数只能出现在列表最后。

  1. def foo(a = 0, b)
  2.         p a+b
  3. end

  4. p foo(2)       # => 2
  5. p foo(1, 2)  # => 3
复制代码
当然,带缺省值的参数必须挨在一起,如下情况是不合语法的:
  1. def bar(a, b = nil, c, d = nil, e)
  2. p [ a, b, c, d, e ]
  3. end
复制代码
这可能是由于 Ruby 解释器使用的 LR(1) 解析器不能轻易处理这种情况。
带缺省值参数和可变长度参数列表可以混用,但前者必须出现在后者之前:
  1. def foo(a = 0, *args)
  2.     p [a, args]
  3. end

  4. foo(5, 6, 7, 8) # => [5, [6, 7, 8]]
  5. foo()           # => [0, []]
复制代码

点评

GOOOOD,太萌了太萌了  发表于 2010-10-13 17:03
不一样吧……  发表于 2010-10-7 20:03
紫苏大人重复了哟~愚者在16楼写过~  发表于 2010-10-7 14:49
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
33
发表于 2010-10-6 07:04:23 | 只看该作者
Ruby 1.9 的块的参数也可以使用 & 来把默认的块转换为 Proc 对象了:
  1. l = lambda { |&l| l.call }
  2. l.call { p 'nested' }
复制代码
而这在 1.8 中则是不合其语法的。相同的效果也可以由我们之前提到的 `->' 运算符实现:
  1. l = ->(&l) { l.() }
  2. l.() { p 'nested' }
复制代码
回复 支持 反对

使用道具 举报

Lv3.寻梦者

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

使用道具 举报

头像被屏蔽

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 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

旅之愚者

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

使用道具 举报

Lv1.梦旅人

旅之愚者

梦石
0
星屑
240
在线时间
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,得到了第一个字母大写的字符串数组了
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-25 11:51

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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