Re: [问题] block和array的传递

楼主: tcling (tcling)   2013-06-22 16:54:08
※ 引述《lemonstar ( )》之铭言:
: 在function中传递参数时
: 传递array是使用 "*" 符号
: def f( a , *arg )
: end
: 传递block是使用 "&" 符号
: def f( a , opts={} , &block )
: end
: 这两个operator设计有什么缘由吗 ?
: 一直在想是不是跟 C 的 pointer 以及 reference 有关 ?
: 还是完全没有关系 ??
我觉得有点误会了
以下提的都是函数参数列中的定义,"*"和"&"不同的地方有不同的意义。
"*" 的使用是在做不定长度引数列(Variable-Length Argument Lists)
在定义函数时,至多只能有一个"*"参数。
而关于传递array,因为Ruby是不做型别检查,按照你的说法似乎有型别检查的认知,
其实只要把array正确地放到这个函数认为是array的参数位置即可。
而 "&" 的使用是在做具名区块(Named Block)(忘记有没有这个名词,记得是这样称呼)
和 "*" 一样,至多只能有一个 "&"参数,存在的话必须在参数列最右边。
而得到的是"Ruby函数语法规则"上的区块,如果不使用具名区块,呼叫这个区块是使用
yield。使用具名区块的好处当然就是把他当物件一样处理。
再来就是区块的传递也不一定要透过这个语法规则,可以这样做:
def func(fst,snd)
puts fst.call + snd.call
end
p1 = Proc.new {"Hello "}
p2 = Proc.new {"World!"}
func(p1, p2) # Hello World!
像上面提到的,Ruby是不做型别检查(Duck Typing),把物件放到这个函数能正常运作的
情况下,放几个区块都没关系。
ps: 这里使用区块这个名词不太好,依语法,区块(block)只能传一个,且用"传"的说法
也不太好,用执行权的转让(yield)比较好。proc(first-class object)可以随意传,
但感觉用区块比较好理解(还是误导XD)。
最后你的问题是这些符号的使用是不是和 C 有关,我也不清楚。Matz是Ruby的发明者,
但他是真正的 C programmer,有些符号的意义从 C 拉过来也不意外。Perl是珍珠,所
以才取名为Ruby(红宝石),有取代Perl的意味,所以也一定从Perl拉一些东西来。中文
Wiki上有谈到,可以去参考一下。
但我还是比较担心你观念上好像有些误解,好像我初学Ruby时也撞过的问题,所以才在这
边囉嗦一些东西,希望有帮助。因为我也还在学习Ruby,有错误的地方也麻烦各位先进后
辈指正一下,感恩!!
作者: kusoayan (Bert)   2013-06-22 23:05:00
推这篇
作者: lemonstar ( )   2013-06-23 03:01:00
感谢说明..block那边的确是有误解..受教了
作者: mars90226 (火星人)   2013-06-23 11:02:00
&放在参数列,会把block变成proc

Links booklink

Contact Us: admin [ a t ] ucptt.com