麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Ruby > 正文

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

2020-10-29 19:40:15
字體:
供稿:網(wǎng)友

Block
定義

some_array.each { |value| puts value + 3 }sum = 0other_array.each do |value| sum += value puts value / sumend
  •     A block is somewhat like the body of an anonymous method
  •     Block can take parameters
  •     Block 只有被 method 調(diào)用時才會起作用,如果 method 中有參數(shù),block 出現(xiàn)在最后面

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

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

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

sum = 0[1,2,3,4].each do |value| square = value * value sum += squareendputs sum # => 30puts 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 shapeYou can define a block-local variables by putting them after s semicolon in the block's parameter listsquare = "some shape"sum = 0[1,2,3,4].each do |value; square|  square = value * value  sum += squareendputs sum # 30puts 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 endendFile.open_and_process("testfile","r") do |file| while line = file.gets   puts line endend

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 的最后一個參數(shù)前面有 & 符號 (&action), 那么當此 method 被調(diào)用時,Ruby 會找一個 code block, 這個 code block 被轉(zhuǎn)換成 class Proc 的一個對象。

class ProcExample def pass_in_block(&action)  @stored_proc = action end def use_proc(parameter)  @store_proc.call(parameter) endendeg = ProcExample.neweg.pass_in_block { |param| puts "The parameter is #{param}" }eg.use_proc(99)# => The parameter is 99def create_block_object(&block) blockendbo = create_block_object { |param| puts "You called me with #{param}" }bo.call 99 # => You called me with 99bo.call "cat" # => You called me with catRuby have two built-in methods that convert a block to an object: lambda and Proc.newbo = 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}endp1 = n_times(23)p1.call(3) #=> 69p2.call(4) #=> 92def power_proc_generator value = 1 lambda { value += value }endpower_proc = power_proc_generatorputs power_proc.call # 2puts power_proc.call # 4lambda 表達式的另一種簡寫方式lambda { |params| ... }# 與下面的寫法等價-> params { ... }# parmas 是可選的proc1 = -> arg1, arg2 {puts "#{arg1} #{arg2}"}proc1.call "hello", "world"# => hello worldproc2 = -> { "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.callendproc.call(1,2,3,4) {puts "in block"}# a = 1# b = [2,3,4]# in block

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 黄在线免费 | 亚洲精品一区二区三区大胸 | 精品乱码久久久久 | 国产精品视频一区二区噜噜 | 欧美成人精品不卡视频在线观看 | 亚洲va在线 | 羞羞视频2023 | 日韩视频一区 | 国产精品区在线12p 午夜视频色 | 国产成视频在线观看 | 成人性生活视频在线观看 | 久久精品久 | 毛片在线看免费 | av电影在线免费 | 久久精品视频7 | 免费黄色大片在线观看 | 久久情爱网 | 色操网| 欧美激情精品久久久久久黑人 | av日韩一区二区三区 | 欧美三日本三级少妇三级99观看视频 | 中文字幕免费在线看 | 男女一边摸一边做羞羞视频免费 | 欧美成人免费电影 | 欧美特黄特色视频 | 美女黄视频在线观看 | 亚洲午夜天堂吃瓜在线 | 久久色伦理资源站 | 视频一区二区三区免费观看 | 国产精品夜色视频一级区 | 亚洲综合视频在线播放 | 青青草成人av | 国产99久久久久 | 成人在线观看免费观看 | 日本黄色不卡视频 | 色域tv| 美女毛片在线观看 | 国产在线观看91精品 | 一区二区三高清 | 亚洲天堂在线电影 | av电影在线观看网站 |