首页 > 编程语言 >无涯教程-Ruby - Blocks块

无涯教程-Ruby - Blocks块

时间:2023-11-19 21:01:13浏览次数:41  
标签:语句 code Blocks puts 无涯 yield test Ruby block

您已经了解了Ruby是如何定义方法的,可以在其中放置大量语句,然后调用该方法。同样,Ruby也具有Block的概念。

Block 语法

block_name {
   statement1
   statement2
   ..........
}

在这里,您将学习使用简单的 yield 语句来调用块。您还将学习使用带参数的 yield 语句来调用块。

Yield 语句

让无涯教程看一下yield语句的示例-

#!/usr/bin/ruby

def test
   puts "You are in the method"
   yield
   puts "You are again back to the method"
   yield
end
test {puts "You are in the block"}

这将产生以下输出-

You are in the method
You are in the block
You are again back to the method
You are in the block

您还可以使用yield语句传递参数。这是一个示例-

#!/usr/bin/ruby

def test
   yield 5
   puts "You are in the method test"
   yield 100
end
test {|i| puts "You are in the block #{i}"}

这将产生以下输出-

You are in the block 5
You are in the method test
You are in the block 100

在这里, yield 语句被编写,后跟参数。您甚至可以传递多个参数。在该块中,将变量放置在两条垂直线(||)之间以接受参数。因此,在前面的代码中,yield 5语句将值5作为参数传递给测试块。

现在,看下面的语句-

test {|i| puts "You are in the block #{i}"}

在这里,值5接收在变量 i 中。现在,观察以下 put 语句-

puts "You are in the block #{i}"

该 put 语句的输出为-

You are in the block 5

如果要传递多个参数,则 yield 语句将变为-

yield a, b

并且块是-

test {|a, b| statement}

参数将以逗号分隔。

Blocks 和 Methods

您已经了解了块和方法如何相互关联。通常,您可以通过使用yield语句从与该块同名的方法中调用一个块。

#!/usr/bin/ruby

def test
   yield
end
test{ puts "Hello world"}

该示例是实现块的最简单方法。您可以使用 yield 语句调用测试块。

#!/usr/bin/ruby

def test(&block)
   block.call
end
test { puts "Hello World!"}

这将产生以下输出-

Hello World!

BEGIN 和 END 块

每个Ruby源文件都可以声明要在文件加载时(BEGIN块)和程序完成执行后(END块)运行的代码块。

#!/usr/bin/ruby

BEGIN { 
   # BEGIN block code 
   puts "BEGIN code block"
} 

END { 
   # END block code 
   puts "END code block"
}
   # MAIN block code 
puts "MAIN code block"

一个程序可能包含多个BEGIN和END块。 BEGIN块按遇到的顺序执行。 END块以相反的顺序执行。执行后,上述程序会产生以下输出-

BEGIN code block
MAIN code block
END code block

参考链接

https://www.learnfk.com/ruby/ruby-blocks.html

标签:语句,code,Blocks,puts,无涯,yield,test,Ruby,block
From: https://blog.51cto.com/u_14033984/8475569

相关文章

  • 无涯教程-Ruby - 方法声明
    Ruby方法与任何其他编程语言中的函数都非常相似。 方法名称应以小写字母开头,如果您以大写字母开头的方法名称,Ruby可能会认为它是一个常量,因此可能会错误地解析该调用。方法应该在调用它们之前定义,否则Ruby将为未定义的方法调用引发异常。语法defmethod_name[([arg[=def......
  • 无涯教程-Ruby - 注释符
    注释是Ruby代码中的注释行,在运行时会被忽略。一行注释以#字符开头,它们从#延伸到该行的末尾,如下所示-#!/usr/bin/ruby-w#Thisisasinglelinecomment.puts"Hello,Ruby!"执行后,上述程序会产生以下输出-Hello,Ruby!Ruby多行注释您可以使用=begin和=end语法注释多......
  • 无涯教程-Ruby - 类和对象
    面向对象的程序涉及类(Class)和对象(Object)。以车辆为例,它包括车轮,马力以及燃油或汽油箱的容量。这些特征构成了Vehicle类的数据成员,车辆还可以具有某些函数,如停止,驾驶和超速行驶,因此,您可以将类定义为特征和函数的组合。车辆类(Vehicle)别可以定义为-ClassVehicle{Numb......
  • 无涯教程-Ruby - 简介
    Ruby是一种面向对象、命令式、函数式、动态的通用编程语言。在20世纪90年代中期由日本计算机科学家松本行弘(Matz)设计并开发。遵守BSD许可证和RubyLicense。它的灵感与特性来自于Perl、Smalltalk、Eiffel、Ada以及Lisp语言。由Ruby语言本身还发展出了JRuby(Java平台)、IronRuby(.N......
  • 无涯教程-RSpec - 期望值
    当您学习RSpec时,您可能会读到很多关于期望值(Expectations)的内容,起初可能会有些混乱。当您看到"Expectations"一词时,应牢记两个主要细节-Expectations只是it块中使用expect()方法的一条语句。当您具有如下代码:expect(1+1).toeq(2)时,您期望表达式1+1的值为2。Ex......
  • 无涯教程-RSpec - 过滤器
    在阅读本节之前,您可能需要阅读有关RSpec元数据(Metadata)的部分,因为事实证明,RSpec筛选(Filtering)基于RSpec元数据。假设您有一个spec文件,它包含两种类型的测试:正确测试和错误测试。让无涯教程这样定义它们-RSpec.describe"AnExampleGroupwithpositiveandnegativeExam......
  • 无涯教程-RSpec - 元数据
    RSpec是一种灵活而强大的工具。RSpec中的元数据(Metadata)函数也不例外。元数据通常指“关于数据的数据”。在RSpec中,这意味着有关您的描述,上下文及其块的数据,让无涯教程看一个例子-RSpec.describe"AnExampleGroupwithametadatavariable",:foo=>17docontext'an......
  • 无涯教程-RSpec - Subjects主题
    RSpecsubjets提供了编写简写测试用例的快捷方式。考虑以下代码-classPersonattr_reader:first_name,:last_namedefinitialize(first_name,last_name)@first_name=first_name@last_name=last_nameendenddescribePersondo......
  • 无涯教程-RSpec - Tags标签
    RSpecTags提供了一种在规范文件中运行特定测试的简便方法。假设您只想运行指定测试方法,则可以使用Tags标签实现。describe"HowtorunspecificExampleswithTags"doit'isaslowtest',:slow=>truedosleep10puts'Thistestisslow!'end......
  • 无涯教程-RSpec - Stubs
    如果您已经阅读了RSpecDoubles部分,那么您已经看到了RSpecStubs,它是一种特殊类型的方法,代表现有方法或尚不存在的方法。这是RSpecDoubles部分中的代码-classClassRoomdefinitialize(students)@students=studentsEnddeflist_student_names......