濮阳杆衣贸易有限公司

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

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

熱門(mén)標(biāo)簽:百度地圖標(biāo)注自定義圖片 地圖標(biāo)注賺錢(qián)項(xiàng)目注冊(cè) 電銷(xiāo)機(jī)器人廠商代理 常德電銷(xiāo)平臺(tái)外呼系統(tǒng)軟件價(jià)格 徐州網(wǎng)絡(luò)外呼系統(tǒng)哪個(gè)好 滴滴外呼系統(tǒng) 白銀外呼paas系統(tǒng) 高德地圖標(biāo)注客服 湖州u友防封電銷(xiāo)卡

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 中本地變量,無(wú)法在 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á)式的另一種簡(jiǎn)寫(xiě)方式

lambda { |params| ... }
# 與下面的寫(xiě)法等價(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)簽:永州 三沙 張家界 梧州 普洱 遼寧 公主嶺 荊門(mén)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《深入講解Ruby中Block代碼快的用法》,本文關(guān)鍵詞  深入,講解,Ruby,中,Block,代碼,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《深入講解Ruby中Block代碼快的用法》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于深入講解Ruby中Block代碼快的用法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    彭阳县| 酒泉市| 茌平县| 甘泉县| 延川县| 镇巴县| 丹凤县| 五大连池市| 洛宁县| 峨山| 双流县| 平原县| 攀枝花市| 石河子市| 罗定市| 仙游县| 乌什县| 锦州市| 镇江市| 玉溪市| 芦山县| 大埔区| 阿克苏市| 绥滨县| 沙洋县| 甘德县| 井研县| 聂荣县| 原阳县| 湖口县| 高清| 洛南县| 中牟县| 咸宁市| 尚志市| 喀喇沁旗| 襄樊市| 陈巴尔虎旗| 凤山县| 泽普县| 枣强县|