scribble

吕小荣

Blog Friends RSS About

Ruby Asterisk 和 Ampersand

20 July, 2014

Ruby 两个符号 * 和 & 经常帮我搞得晕头转向,今天梳理了他们的两个两个最主要的使用场景:

  • 调用方法时
  • 定义方法时

Asterisk *

在调用方法时,若在参数中加上 *,表示:先拆分数组,再调用方法

a = ["Jesus", "Loves", "U"]

# 以下两种效果一致
p(*a)
p(a[0], a[1], a[2])

在定义方法时,若在参数中加上*, 则表示: 方法内部会把所有的参数转化为一个数组。

def say_hello(*a)
  puts a
  puts a.class
end

c, d, e = "I", "will", "be", "merged"

# c, d, e 会被合并为一个数组 a
> say_hello(c, d, e)
> I
  will
  be
  merged
  Array

Ampersand \&

调用方法时, \& 把一个 proc 对象转化为块,并传递给方法。

my_proc = proc { "Jerusalem" }


def say_hello(greeting)
  "#{greeting} #{yield}"
end

# 以下两种写法相似
say_hello("hello", &my_proc)

say_hello("hello"){"Jerusalem"}

在定义方法时,\& 方法内部会把传递进来的块转化为 proc。

def say_hello(greeting, &jerusalem)
  # It's a proc
  p jerusalem.class
end