亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Ruby > 正文

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

2020-10-29 19:40:15
字體:
來源:轉載
供稿:網友

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 調用時才會起作用,如果 method 中有參數,block 出現在最后面

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

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

如果 block 中的變量只出現在 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 的最后一個參數前面有 & 符號 (&action), 那么當此 method 被調用時,Ruby 會找一個 code block, 這個 code block 被轉換成 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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲乱码国产乱码精品精| 91免费精品视频| 国产精品一区专区欧美日韩| 精品露脸国产偷人在视频| 亚洲国产日韩欧美在线动漫| 日韩中文字幕视频在线| 国产精品老女人视频| 久久久久久中文字幕| 日韩精品在线观| 日韩亚洲欧美中文在线| 色综合久久天天综线观看| 91精品国产高清久久久久久久久| 91九色精品视频| 九九精品在线观看| 国模精品一区二区三区色天香| 亚洲精品大尺度| 亚洲iv一区二区三区| 亚洲欧洲在线播放| 中文字幕日韩在线视频| 色综合色综合网色综合| 亚洲精品色婷婷福利天堂| 免费不卡在线观看av| 欧美一区二区影院| 久久99久久99精品免观看粉嫩| 亚洲tv在线观看| 韩剧1988在线观看免费完整版| 国产成人精品免高潮费视频| 亚洲欧美另类中文字幕| 国产美女高潮久久白浆| 色综合色综合久久综合频道88| 欧美精品在线网站| 日韩av在线免费| 北条麻妃一区二区在线观看| 中文字幕日本精品| 国产精品一区二区三区成人| 亚洲综合色激情五月| 欧美专区日韩视频| 精品亚洲一区二区三区四区五区| www.欧美精品一二三区| 日韩欧美aⅴ综合网站发布| 精品国产91久久久久久老师| 97在线视频免费播放| 亚洲国产精品女人久久久| 精品国产乱码久久久久久婷婷| 日韩成人在线观看| 欧美巨大黑人极品精男| 8090理伦午夜在线电影| 欧美诱惑福利视频| 日韩精品极品视频| 欧美情侣性视频| 日本三级韩国三级久久| 日韩电影中文 亚洲精品乱码| 91精品在线国产| 久久精品国产精品亚洲| 国产精品大片wwwwww| 国产一区二区三区在线观看网站| 亚洲女人初尝黑人巨大| 国产成人精品在线播放| 国产偷国产偷亚洲清高网站| 精品国产自在精品国产浪潮| 美日韩精品免费观看视频| 国产一区二区动漫| 亚洲爱爱爱爱爱| 日韩精品高清在线观看| 久久久久99精品久久久久| 日韩高清欧美高清| 亚洲国产精品va在线| 成人国产精品久久久久久亚洲| 亚洲人成电影在线观看天堂色| 欧美日韩国产精品一区二区不卡中文| 日韩专区在线观看| 一本久久综合亚洲鲁鲁| 97人人爽人人喊人人模波多| 2021久久精品国产99国产精品| 亚洲最大的网站| 在线视频日本亚洲性| 欧美性做爰毛片| 久久九九国产精品怡红院| 韩国v欧美v日本v亚洲| 夜夜躁日日躁狠狠久久88av| 九九综合九九综合| 青青a在线精品免费观看| 日韩欧美极品在线观看| 777777777亚洲妇女| 国产成人精品在线| 亚洲国产精品久久91精品| 欧美日韩国产丝袜美女| 亚洲va久久久噜噜噜久久天堂| 一区二区三区四区精品| 欧美性xxxx极品hd欧美风情| 日韩在线资源网| 成人性生交大片免费看视频直播| 亚洲欧美在线看| 久热爱精品视频线路一| 日韩免费电影在线观看| 91在线色戒在线| 精品美女久久久久久免费| 亚洲一区国产精品| 精品久久久av| 色偷偷偷综合中文字幕;dd| 精品一区电影国产| 亚洲**2019国产| 日韩av在线一区二区| 国产成人精品一区二区| 欧美中文字幕视频| 亚洲精品视频在线观看视频| 69国产精品成人在线播放| 日韩中文视频免费在线观看| 国产高清视频一区三区| 亚洲自拍欧美色图| 欧美理论电影在线播放| 91美女片黄在线观看游戏| 国产精品日韩专区| 色综合久久久888| 97在线看免费观看视频在线观看| 欧美在线观看网站| 国产一区二区日韩| 欧美精品www在线观看| 精品偷拍一区二区三区在线看| 国产精品视频成人| 久久久久久久久久久久久久久久久久av| 青青草国产精品一区二区| 日韩成人在线视频网站| 亚洲国产一区自拍| 98精品国产自产在线观看| 一本一道久久a久久精品逆3p| 亚洲人成电影网站| 国产精品视频地址| 日韩精品免费综合视频在线播放| 国产成人久久精品| 久热精品视频在线观看一区| 久久久亚洲天堂| 亚洲人成网站免费播放| 欧美激情一区二区三区在线视频观看| 日韩在线播放一区| 久久久精品一区| 国产精品日韩欧美综合| 亚洲美女精品成人在线视频| 一本一本久久a久久精品综合小说| 亚洲一区二区三区视频| www日韩中文字幕在线看| 成人福利免费观看| 8090成年在线看片午夜| 98精品国产自产在线观看| 中文字幕在线观看亚洲| 91高潮在线观看| 在线精品高清中文字幕| 欧美一区二区三区四区在线| 亚洲乱码av中文一区二区| 日本中文字幕不卡免费| 日韩精品中文字幕在线| 欧美xxxx18性欧美| 亚洲国产精品久久精品怡红院| 欧美日韩另类在线| 成人乱人伦精品视频在线观看| 亚洲欧美中文日韩v在线观看| 久久精品国产亚洲7777| 国产亚洲精品美女久久久久| 91天堂在线观看| 欧美成人精品不卡视频在线观看| 亚洲成人a级网| 91亚洲永久免费精品| 91wwwcom在线观看| 91精品国产自产91精品|