|
锁定老贴子 主题:ruby学习中的问题
该帖已经被评为良好帖
|
|
|---|---|
| 作者 | 正文 |
|
时间:2006-09-26
1。有attr_reader, attr_writer,很好。不过这个
def initialize(var1, var2, var3) @var1 = var1 @var2 = var2 @var3 = var3 end 也很烦阿。怎么标准库里面没有对这个东西的帮助函数?非要自己写一个然后include进来?这又何苦?
module Misc
private
def Object.ctor(*vars)
define_method(:initialize) do |*params|
vars.each_with_index do |var, i|
instance_variable_set("@"+var.to_s, params[i])
end
end
end
def Object.decl_readable(*vars)
attr_reader(*vars)
ctor(*vars)
end
def Object.decl_mutable(*vars)
attr_accessor(*vars)
ctor(*vars)
end
end
然后就可以不写讨厌的initialize,而写 class Person decl_readable :name, :age, :sex end 2。proc和block的区别真的很别扭。proc不过是个优化了的,有一定限制的proc,这种优化细节还是藏起来的好。希望mats早点把这个修改过来。还我们一片everything is object的蓝天。 3。block的参数居然可以是instance variable。惊!甚至居然可以是外面scope定义好了的变量,虎躯剧震惊! 其实instance variable不可怕,毕竟这个'@'就可以很清楚地表明意图。就是这个局部变量比较吓人! 4。如布娃娃所说,只能mixin module,不能mixin class和object么? 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2006-09-26
丫还虎躯 剧震惊!
不过,我等 ajoo fans 都已经看到了ajoo偶像的资料。 确是180的虎躯。 引用 block的参数居然可以是instance variable。惊!甚至居然可以是外面scope定义好了的变量,虎躯剧震惊! Lisp, Perl都有这个dynamic scope吧。 这不是很好?可以从外面注入block作为AOP Interceptor。打印个Log什么的。只要有这个名字在就行。 |
|
| 返回顶楼 | |
|
时间:2006-09-26
这不是dynamic scope。
block parameter应该是形式参数。就像java的函数参数名字。 这个名字和外面scope的名字如果冲了,一般或者用shadowing(java就是shadowing,虽然eclipse会警告),或者报错。 象ruby这样默默地从了的,还是第一次看见。 |
|
| 返回顶楼 | |
|
时间:2006-09-26
也不能说是ruby这样默默地从了,是现在的ruby IDE默默地从了,动态语言IDE 应该在静态语法分析上多下功夫。
|
|
| 返回顶楼 | |
|
时间:2006-09-26
你没明白。
x = 1 ... callcc do |x| ... end # surprise, x points to a continuation! 要是象java那样是shadowing的效果,ide不警告也没什么大不了的。但是现在,我不小心弄了一个变量重名(根据java以及很多其他语言的经验,应该不要紧的),它居然悄悄改变了我x变量的值。 |
|
| 返回顶楼 | |
|
时间:2006-09-26
果然震惊。龙躯剧震惊。
虽然,我没太看明白,但是这个 # surprise, x points to a continuation! 确实显示了严重性。 刚看了ajoo的contiunation article。 代码遇到continuation,就要跳出去的(escape)。 |
|
| 返回顶楼 | |
|
时间:2006-09-26
引用 2。proc和block的区别真的很别扭。proc不过是个优化了的,有一定限制的proc,这种优化细节还是藏起来的好。希望mats早点把这个修改过来。还我们一片everything is object的蓝天。
你这是什么意思。 在我看来, proc 正是为了实现“ everythign is object ”才引入的。 不仅仅 thing 是对象,过程也是对象。 这是我对 proc 的理解。 block 和 proc 的区别,在于 block 更加 lightweight, 因此在很多场合用起来更方便,更少累赘。 我觉得这个设计挺好的。为啥觉得不好呢? 我倒是觉得 lambda 和 Proc 之间的差别有点别扭, 请参见我在 Ruby for Rails 的译文: 不管怎样,用 lambda 生成的 Proc 对象和用 Proc.new 生成的 Proc 对象之间是有差别的。这是一个微妙的差别,在某些时候,你需要意识到这个差别。这个差别与 return 关键字相关。lambda 中的 return 从 lambda 返回。而 Proc 中的 return 从外围方法(surrounding method)返回。 |
|
| 返回顶楼 | |
|
时间:2006-09-26
armlinux-w 写道 引用 2。proc和block的区别真的很别扭。proc不过是个优化了的,有一定限制的proc,这种优化细节还是藏起来的好。希望mats早点把这个修改过来。还我们一片everything is object的蓝天。
你这是什么意思。 在我看来, proc 正是为了实现“ everythign is object ”才引入的。 不仅仅 thing 是对象,过程也是对象。 这是我对 proc 的理解。 block 和 proc 的区别,在于 block 更加 lightweight, 因此在很多场合用起来更方便,更少累赘。 我觉得这个设计挺好的。为啥觉得不好呢? 我倒是觉得 lambda 和 Proc 之间的差别有点别扭, 请参见我在 Ruby for Rails 的译文: 不管怎样,用 lambda 生成的 Proc 对象和用 Proc.new 生成的 Proc 对象之间是有差别的。这是一个微妙的差别,在某些时候,你需要意识到这个差别。这个差别与 return 关键字相关。lambda 中的 return 从 lambda 返回。而 Proc 中的 return 从外围方法(surrounding method)返回。 block是不是lightweight,这是实现细节。实际上它的功能和proc一样的。一样的功能有两个东西,不爽。 至于说block的语法比proc方便,这是语法糖问题,和我说的无关。如果可能,我希望block/proc被统一起来,现在的block和proc语法可以自由使用。不要搞什么"new Proc",不要搞什么"&proc"这些古怪东西,{|x|...}这个block应该可以直接当作proc使用(置于系统内部是否要隐士作new Proc转换,应该解释器自己自动完成,我不关心)。 |
|
| 返回顶楼 | |
|
时间:2006-09-26
ajoo 写道 block是不是lightweight,这是实现细节。实际上它的功能和proc一样的。一样的功能有两个东西,不爽。 至于说block的语法比proc方便,这是语法糖问题,和我说的无关。如果可能,我希望block/proc被统一起来,现在的block和proc语法可以自由使用。不要搞什么"new Proc",不要搞什么"&proc"这些古怪东西,{|x|...}这个block应该可以直接当作proc使用(置于系统内部是否要隐士作new Proc转换,应该解释器自己自动完成,我不关心)。 实际上,类似的功能有三个东西。 Proc, lambda, block。 block 和 Proc 的差别,我认为可以理解。 这其中的差别有点类似于单例类和普通类的差别。一个是无名的,一个有名的。 不过, Proc 和 lambda 的差别, 我比较困惑。 |
|
| 返回顶楼 | |
|
时间:2006-09-26
貌似block和proc并不是同样的东西,
proc除了包含block的code之外,还包含了local envrionment,它是一个closure |
|
| 返回顶楼 | |









