Alex学Ruby[详解 block和Proc对象]
生活随笔
收集整理的這篇文章主要介紹了
Alex学Ruby[详解 block和Proc对象]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Ruby block Part One:
本部分內容是基于Ruby 1. 8. 7
lambda方法:
?例子1:
myBlock = lambda {|x| puts x}?????????????? =>#<Proc:0x00008908@(irb):1>
myBlock.call("Ruby way")??
=>?? Ruby way
puts myBlock.class
=>?? Proc
由此例子可以看出, lambda方法可以直接生成一個Proc對象。
例子2:
sub_lambda = lambda {|x,y| x - y}
=> #<Proc:0x0007ff44@(irb):4>
sub_lambda(2)
=>NoMethodError: undefined method `sub_lambda' for main:Object
sub_lambda.call(2)
=>ArgumentError: wrong number of arguments (1 for 2)
sub_lambda.call(2,3,4)
=>ArgumentError: wrong number of arguments (3 for 2)
sub_lambda.call(2,"3")
=>TypeError: String can't be coerced into Fixnum
sub_lambda.call(2,3)
=> -1
由此例可以看出,lambda生成的proc對象必須被call才可被調用。 而lambda方法會檢查傳入的參數個數,和參數類型。
例子3:
sub_procnew = Proc.new {|x,y| x-y}
=> #<Proc:0x00052238@(irb):12>
sub_procnew.call(4)
=>TypeError: nil can't be coerced into Fixnum
sub_procnew.call(4,3,5)
?=> 1
sub_procnew.call(4,"3",5)
=>TypeError: String can't be coerced into Fixnum
sub_procnew.call(4,3,"5")?
=> 1
由此例看出,Proc.new生成的對象不會去檢查參數個數, 只是多退少補(nil), 但是會檢查參數數據類型。
例子4:
def call_block_twice
????yield
????puts “going to call the block”
?? yield
?? puts “Going to call the block again”
end
call_block_twice {puts “This is a block”}
這個例子是兩次調用塊的例子。
我們可以重寫這個方法:
def multiple_yield(n)
????if block_given?
???????? n.times { yield }
????else
???????? raise ArgumentError.new(“Block is required to call yield multip times”)
????end
end
multiple_yield(2) { puts “I m a block”}
例子5,你也可以這么寫:
def foo(&block)
?? block.call
end
foo {puts “Hi”}
本部分內容是基于Ruby 1. 8. 7
lambda方法:
?例子1:
myBlock = lambda {|x| puts x}?????????????? =>#<Proc:0x00008908@(irb):1>
myBlock.call("Ruby way")??
=>?? Ruby way
puts myBlock.class
=>?? Proc
由此例子可以看出, lambda方法可以直接生成一個Proc對象。
例子2:
sub_lambda = lambda {|x,y| x - y}
=> #<Proc:0x0007ff44@(irb):4>
sub_lambda(2)
=>NoMethodError: undefined method `sub_lambda' for main:Object
sub_lambda.call(2)
=>ArgumentError: wrong number of arguments (1 for 2)
sub_lambda.call(2,3,4)
=>ArgumentError: wrong number of arguments (3 for 2)
sub_lambda.call(2,"3")
=>TypeError: String can't be coerced into Fixnum
sub_lambda.call(2,3)
=> -1
由此例可以看出,lambda生成的proc對象必須被call才可被調用。 而lambda方法會檢查傳入的參數個數,和參數類型。
例子3:
sub_procnew = Proc.new {|x,y| x-y}
=> #<Proc:0x00052238@(irb):12>
sub_procnew.call(4)
=>TypeError: nil can't be coerced into Fixnum
sub_procnew.call(4,3,5)
?=> 1
sub_procnew.call(4,"3",5)
=>TypeError: String can't be coerced into Fixnum
sub_procnew.call(4,3,"5")?
=> 1
由此例看出,Proc.new生成的對象不會去檢查參數個數, 只是多退少補(nil), 但是會檢查參數數據類型。
例子4:
def call_block_twice
????yield
????puts “going to call the block”
?? yield
?? puts “Going to call the block again”
end
call_block_twice {puts “This is a block”}
這個例子是兩次調用塊的例子。
我們可以重寫這個方法:
def multiple_yield(n)
????if block_given?
???????? n.times { yield }
????else
???????? raise ArgumentError.new(“Block is required to call yield multip times”)
????end
end
multiple_yield(2) { puts “I m a block”}
例子5,你也可以這么寫:
def foo(&block)
?? block.call
end
foo {puts “Hi”}
總結
以上是生活随笔為你收集整理的Alex学Ruby[详解 block和Proc对象]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL SERVER:SQLDMO库文件
- 下一篇: 拒绝亡羊补牢!SQL Server服务器