code block

  • code block ⼀种匿名⽅法
{ puts "Hello" } # 这是一個 block

do
 puts "Blah" # 这也是一個 block
 puts "B
end
  • 內部迭代器(iterator)
# 处理数组 people
people = ["David", "John", "Mary"]
people.each do |person|
 puts person
end
# 反复五次
5.times { puts "Ruby rocks!" }
# 从一数到九
1.upto(9) { |x| puts x }
  • 其他迭代⽅式
# 迭代并造出另一个数组
a = [ "a", "b", "c", "d" ]
b = a.map {|x| x + "!" }
puts b.inspect
# 结果是 ["a!", "b!", "c!", "d!"]
# 找出符合条件的值
b = [1,2,3].find_all{ |x| x % 2 == 0 }
b.inspect
# 结果是 [2]
  • 当作判断条件
# 迭代并根据条件刪除
a = [ "a", "b", "c" ]
a.delete_if {|x| x >= "b" }
# 结果是 ["a"]
# 条件排序
[2,1,3].sort! { |a, b| b <=> a }
# 结果是 [3, 2, 1]
  • functional programming
# 计算总和
(5..10).reduce {|sum, n| sum + n }
# 找出最长字串find the longest word
longest = ["cat", "sheep", "bear"].reduce do |memo,
word|
 ( memo.length > word.length )? memo : word
end
  • 仅执⾏⼀次呼叫 pre- post- processing
file = File.new("testfile", "r")
# ...处理文件
file.close
# 但 Ruby 习惯⽤以下写法
File.open("testfile", "r") do |file|
 # ...处理文件
end
# 文件自动关闭
  • Yield 在方法中使用 yield 可以执行 Code block 参数
# 定义方法
def call_block
  puts "Start"
  yield
  yield
  puts "End"
end

call_block { puts "Blocks are cool!" }
# 输出
# "Start"
# "Blocks are cool!"
# "Blocks are cool!"
# "End"

带有参数的Code block
def call_block
  yield(1)
  yield(2)
  yield(3)
end

call_block { |i|
  puts "#{i}: Blocks are cool!"
}
# 輸出
# "1: Blocks are cool!"
# "2: Blocks are cool!"
# "3: Blocks are cool!"
  • Proc object 可以将Code block明确转成一个变数:
def call_block(&block)
  block.call(1)
  block.call(2)
  block.call(3)
end

call_block { |i| puts "#{i}: Blocks are cool!" }

# 輸出
# "1: Blocks are cool!"
# "2: Blocks are cool!"
# "3: Blocks are cool!"

# 或是先宣告出 proc object (有三種寫法,大同小異)
proc_1 = Proc.new { |i| puts "#{i}: Blocks are cool!" }
proc_2 = lambda { |i| puts "#{i}: Blocks are cool!" }
proc_3 = -> (i) {  puts "#{i}: Blocks are cool!"  }

call_block(&proc_1)
call_block(&proc_2)
call_block(&proc_3)

# 分別輸出
# "1: Blocks are cool!"
# "2: Blocks are cool!"
# "3: Blocks are cool!"
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 代码块是什么? 代码块是由 {...} 或 do..end 包围起来的一块代码。代码块通常用于实现自定义的运算,有...
    bookinstock_阅读 678评论 1 1
  • 前言 最近代码量少, 遂在网上找各种资料学习代码的优雅之道. GCC Code Block Evaluation...
    Jamp_iOS阅读 2,934评论 23 44
  • 阳光从缝隙里照进来 看着阳光中的尘土,听着机器的轰鸣 心中却如一湖平静的秋水,清澈却又漂着黄叶! 正如这一夜的秋凉...
    且看浮生阅读 255评论 0 1
  • 文/小狐 寻觅一缕清香,初看这个题目有点高中作文的应试味道,但细细品味起来,寻觅清香,颇有周国平幸福课的影子,那就...
    小狐的冰山阅读 608评论 0 0
  • 一张图让你赢得谈判 微信号 how13355789267 欢迎加好友交流 暗号:商学院 今天平安夜,给大家加点餐,...
    精英之门阅读 555评论 3 15