Code blocks

Code blocks是Ruby特有的很强大的特点。

可以通过这个实现回调

对比###

  • Java的匿名内部类更加简单。
  • 比C语言的指针简单。

两种写作形式###

{puts "hello"}

以及:

do
    club.enroll(person)
    person.socialize
end

比较好的规范是:单行用第一种,多行代码用第二种。

使用方式###

在函数调用后面写:

greet {puts "Hi"}

其中greet是函数名,如果该函数有参数,那么参数要出现在代码块(code block)前面。
Ruby中函数没有参数,可以省略括号。

如:

greet("Dave","loyal customer") {puts "Hi"}

这种形式好像就是函数定义了,但注意这里是在Ruby,函数定义不同于C语言或者Java语言。

上面只是说明code blocks放置的位置,其实并没有调用块中的内容。

调用code blocks###

学习一个关键字:yield

def call_back
    puts "Start of method"
    yield
    yield
   puts "End of method"
end

call_block { puts "In the block"}

这样一调用函数,在内部有两个声音在喊,调用后面的code block!因为共有两个声音(yield),所以调用两次。

输出结果是:

Start of method
In the block
In the block
End of method

yield什么###

上面的例子中,yield只是喊,但是并没有喊出独特的声音来。既然有这样的发声通道,是不是可以定制化地喊出自己的声音呢?

答案是可以的:为yield提供参数

def who_says_what
    yield("Dave","hello") #通过yield喊出自己的声音
    yield("Andy","goodbye")
end

who_says_what {|person,phase| puts "#{person} says #{phase}"}

通过在yield中定制参数,参数值将会被传递到code block中。
但是code block如何过来,需要一定的格式。

不同于函数,code block接参数的方式是在两个竖线内。关于这点,有一个很有趣的说明:

有些人认为,这种传递就像是函数传递参数。这样的理解有一定道理,但也并非“全部的故事”。最好将这种方式看作是"coroutine",运行时控制权在二者之间来回转换。

结合数组一起服用###

animals = %w{ ant bee cat dog} #构造一个数组
animals.each {|animal| puts animal}  #array.each是个函数,后面跟的是code block
#输出:
ant
bee
cat 
dog

虽然没有看底层源码,但也可以想到each函数中有yield,否则不会调用后面的code block。

开吃一些语法糖##

['cat', 'dog','horse'].each {|name| print name, " "}
5.times { print "*"}
3.upto(6) {|i| print i}
('a'..'e').each {|char| print char}
puts
#输出
cat dog horse *****3456abcde

注意数字是对象,对象必然自带了一些函数

你可能感兴趣的:(Code blocks)