Why Ruby amazes me? PRuby Chap 6 方法调用

Gem Gatherer 发表于 2008-05-02 17:01:19

用def可以定义一个方法,方法必须以一个小写字母开头
** 如果使用大写字母,不会出错,但是Ruby会优先猜测这是一个常量而不是一个方法调用,解析可能出错

指定形参默认值
def cool_dude(arg1="Miles", arg2="Coltrane", arg3="Roach")
  "#{arg1}..."
end

** 不能在方法体内定义非单件类或模块
** 可以嵌套定义方法,但此方法只有在外部方法执行的时候才得到定义
** 方法的返回值是执行的最后一个表达式的值,或者return显式返回的值

可变参数列表
def varargs(arg1, *rest)
  ...
end
这样,第一个参数赋值给arg1,其它剩余的参数都会被装入到一个新的Array中,然后赋值给第二个参数
** 它还有个有趣的逆操作:)
def five(a,b,c,d,e)
end
<-- five(1,2,3,*['a','b'])
<-- five( *(10..14).to_a)
看见了么?可以传递一个前面加*的数组,这样,数组元素就会自动被视为单独的参数。

方法和block
调用一个方法时,可以提供一个block与其关联,在方法内可以用yield调用这个block
** 如果方法定义的最后一个参数前缀是&,那么所关联的block会被转换为一个Proc对象,然后赋值给这个参数
def initialize(name,&block)
  @name, @block=name, block
end
def get_tax(amount)
  "Tax = #{@block.call(amount)} "  # 这样便于传递代码片段对象。。。很方便不是么:)
end

调用方法
** 如果没有二义性,在调用方法时,可以省略参数列表两侧的括号。
** 如果在方法名和左括号之间有空格,将得到一个警告

返回值
Ruby可以轻易的返回多个值.
def meth
  return 1,2
end
<-- meth
--> [1, 2]

更加动态的block : 让lambda来辅助block!
if d > 0
 calc = lambda {|n| n*number}
else
  calc = lambda {|n| n+number}
<-- puts((1..10).collect(&calc).join(", "))
在实参里加&的参数是代表什么?Ruby将认为它是一个Proc对象,会将其从参数列表中删除,并将Proc对象转化为一个block,然后关联到该方法

散列参数
当我们要传送动态创建的散列表作为参数时,我们可以不用一般创建散列表的方式(那样容易和block混起来)...
list.create_search('short jazz songs',
                   'genre'  =>  'jazz',
                   'duration_less_than' => 270)
当然,这样要散列表是形参表的最后一个才能有效。
** 上面的调用还有一个形式
list.create_search('short jazz songs',
                   :genre  =>  :jazz,
                   :duration_less_than => 270)

关键词(Tag): ruby


收藏: QQ书签 del.icio.us 订阅: Google 抓虾

最新评论


  • 追忆似风
    2008-06-06 19:38:09 匿名 59.38.*.*

    知识不能瓶装窖藏。
    它渴望被传播,被分享。
    很感动。

发表评论

* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 
 

分类小组论坛
杂谈, 娱乐、八卦, 文学、艺术, 体育, 旅游、同城, 象牙塔, 情感, 时尚、生活, 星座, 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定