佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > 深入講解Ruby中Block代碼快的用法

深入講解Ruby中Block代碼快的用法

熱門標(biāo)簽:客戶服務(wù) 百度AI接口 企業(yè)做大做強(qiáng) Win7旗艦版 硅谷的囚徒呼叫中心 語音系統(tǒng) 電話運(yùn)營中心 呼叫中心市場(chǎng)需求

Block
定義

some_array.each { |value| puts value + 3 }

sum = 0
other_array.each do |value|
 sum += value
 puts value / sum
end

  •     A block is somewhat like the body of an anonymous method
  •     Block can take parameters
  •     Block 只有被 method 調(diào)用時(shí)才會(huì)起作用,如果 method 中有參數(shù),block 出現(xiàn)在最后面

Block 中的變量
如果 block 的本地變量的名字和 block 之外但是在同樣 scope 里面的 變量名字一樣,那他們兩個(gè)是一樣的。block 內(nèi)變量的值會(huì)改變 block 外變量的值。

sum = 0
[1,2,3,4].each do |value|
 sum += value
 puts value / sum
end
puts sum # => 30

如果 block 中的變量只出現(xiàn)在 block 中,那么它只是 block 中本地變量,無法在 block 之外被引用。

sum = 0
[1,2,3,4].each do |value|
 square = value * value
 sum += square
end
puts sum # => 30
puts square # undefined local variable or method 'square' for main:Object NameError>

Parameters to a block are always local to a block, even if they have the same name as locals in the surrounding scope.

value = "some shape"
[1,2].each { |value| puts value }
puts value

# 1
# 2
# some shape

You can define a block-local variables by putting them after s semicolon in the block's parameter list

square = "some shape"
sum = 0
[1,2,3,4].each do |value; square|
  square = value * value
  sum += square
end
puts sum # 30
puts square # some shape

  • By making square block-local, values assigned inside the block will not affect the value of the variable with the same name in the outer scope.
  • Blocks for Transactions
  • You can use blocks to define a chunk of code that must be run under some kind of transnational control
class File
 def self.open_and_process(*args)
  f = File.open(*args)
  yield f
  f.close
 end
end

File.open_and_process("testfile","r") do |file|
 while line = file.gets 
  puts line
 end
end

Blocks Can Be Objects

You can convert a block into an object, store it in variables, pass it around, and then invoke its code later.

如果 method 的最后一個(gè)參數(shù)前面有 符號(hào) (action), 那么當(dāng)此 method 被調(diào)用時(shí),Ruby 會(huì)找一個(gè) code block, 這個(gè) code block 被轉(zhuǎn)換成 class Proc 的一個(gè)對(duì)象。

class ProcExample
 def pass_in_block(action)
  @stored_proc = action
 end

 def use_proc(parameter)
  @store_proc.call(parameter)
 end
end

eg = ProcExample.new
eg.pass_in_block { |param| puts "The parameter is #{param}" }
eg.use_proc(99)
# => The parameter is 99

def create_block_object(block)
 block
end

bo = create_block_object { |param| puts "You called me with #{param}" }
bo.call 99 # => You called me with 99
bo.call "cat" # => You called me with cat

Ruby have two built-in methods that convert a block to an object: lambda and Proc.new

bo = lambda { |param| puts "You called me with #{param}" }
bo.call 99 # => You called me with 99

  • Blocks Can Be Closures
  • Closure: Variables in the surrounding scope that are referenced in a block remain accessible accessible for the life of that block and the life on any Proc object created from that block.
def n_times(thing)
 lambda {|n| thing * n}
end

p1 = n_times(23)
p1.call(3) #=> 69
p2.call(4) #=> 92

def power_proc_generator
 value = 1
 lambda { value += value }
end

power_proc = power_proc_generator
puts power_proc.call # 2
puts power_proc.call # 4

lambda 表達(dá)式的另一種簡寫方式

lambda { |params| ... }
# 與下面的寫法等價(jià)
-> params { ... }
# parmas 是可選的

proc1 = -> arg1, arg2 {puts "#{arg1} #{arg2}"}

proc1.call "hello", "world"
# => hello world

proc2 = -> { "Hello World" }
proc2.call # => Hello World

Block Parameter List

Blocks can take default values, splat args, keyword args and a block parameter

proc = -> a, *b, block do 
 puts "a = #{a.inspect}"
 puts "b = #{b.inspect}"
 block.call
end

proc.call(1,2,3,4) {puts "in block"}
# a = 1
# b = [2,3,4]
# in block

您可能感興趣的文章:
  • Ruby中Block和迭代器的使用講解
  • 深入理解Ruby中的block概念
  • Ruby中的block、proc、lambda區(qū)別總結(jié)
  • Ruby中使用Block、Proc、lambda實(shí)現(xiàn)閉包
  • Ruby中的block代碼塊學(xué)習(xí)教程

標(biāo)簽:喀什 安康 長沙 海南 崇左 濟(jì)南 山西 山西

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《深入講解Ruby中Block代碼快的用法》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    琼海市| 武胜县| 正镶白旗| 石台县| 无为县| 吉安市| 高阳县| 旬阳县| 颍上县| 青铜峡市| 汉阴县| 扎兰屯市| 隆安县| 蒙自县| 娄烦县| 顺昌县| 招远市| 台北市| 和田县| 长子县| 汾阳市| 昭苏县| 贞丰县| 忻城县| 保靖县| 安溪县| 嘉义市| 遂溪县| 祁东县| 淄博市| 砀山县| 左权县| 四川省| 丽水市| 荔浦县| 阿拉善盟| 仁怀市| 大同市| 海阳市| 诏安县| 团风县|