Ruby2 Method and Block

Asura 2018年02月17日 91次浏览

Method(Function)

def hi(name)
    p "hi " + name
end
hi("666") # => "hi 666"
hi "code" #括号省略  => "hi code"
def hello name
    p "hello #{name}"
end
hello "world" # => "hello world"

Method 参数

def hi name="code"
    p "hi " +name
end
hi # => "hi code"
def hi name,age=32
    p "#{name} is #{age}"
end
hi "code" # => "code is 32"
hi "code", 54 # => "code is 54"

Method 返回值

凡有方法都有返回值,方法体最后一行代码的返回值默认会做为方法的返回值,也可以显式的使用return关键字

def hi
    p "ok"
end
hi # =>nil
def hi
    "ok"
end
hi #=> "ok"
def hi
    return "2"
    1
end
hi # => 2

Block

Block类似于一个方法,可以使用do/en来定义,也可以使用大括号{}

File.open("access.log","w+") do |f|
    f.puts "line 1"
end

Block内置方法

[1, 2, 3].each do |x|
    p x
end
{a:1,b:2}.each do |x, y|
    p y
end

Block变量作用域

#ruby 2.0之前外部变量x的值会被block修改
x = 10
[1, 2, 3].each do |x|
    p x
end
x # =>10

自定义block

def hi name
    yield(name)
end
hi("code"){ |x|
    "hello #{x}"
}

yield 为调用外部block的关键字(个人感觉比较像C#的委托调用)

proc

hi = proc{|x| "hello #{x}"}
hi.call("world")
# 等同于
hi = Proc.new {|x| "hello #{world}"}
hi.call("world")

proc相当于定义了一个方法变量,可以吧方法当做参数传递(个人感觉比较像C#的委托)

lambda

lambda和proc非常相似

hi =lambda {|x| "hello #{x}"}
hi.call("world")

研究lambda和proc的区别

  1. Proc和Lambda都是对象,而Block不是
  2. 参数列表中最多只能有一个Block,但是可以有多个Proc或Lambda
  3. Lambda对参数的检查很严格,而Proc则比较宽松
  4. Proc和Lambda中return关键字的行为是不同的