`
fujinbing
  • 浏览: 232937 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ruby 中 block 的使用方法

    博客分类:
  • java
 
阅读更多

对包含代码的字符串和block求解。
Ruby提供了多种不同类型的求解方式:eval、instance_eval和class_eval。

class_eval  可以在一个类的定义或者module定义的上下文中对给定字符串或block进行求解。我们常常用class_eval来向类的定义中加入方法,或是包含其他的module。

klass = Class.new
klass.class_eval do
def encoded_hello
htnl_escape "Hello World"
end
end
klass.new.encoded_hello #=> Hello World

不使用class_eval也可以达到上面的效果,但是要牺牲代码的可读性。

klass = Class.new
klass.send :define_method, :encoded_hello do
html_escape "Hello World"
end
klass.send :public, :encoded_hello
klass.new.encoded_hello #=> Hello World


使用Object的instance_eval方法,可以在一个类实例的上下文中对给定字符串或block进行求解。这是个功能强大的概念:你可以先在任何上下文中创建一块代码,然后在一个单独的对象实例的上下文中对这块代码进行求解。为了设定代码执行的上下文,self变量要设置为执行代码时所在的对象实例,以使得代码可以访问对象实例的变量。

class Navigator
def initialize
@page_index = 0
end
def next
@page_index += 1
end
end
navigator = Navigator.new
navigator.next
navigator.next
navigator.instance_eval "@page_index" #=> 2
navigator.instance_eval { @page_index } #=> 2

使用Kernel的eval方法可以在当前上下文中对一个字符串求解。可以选择为eval方法制定一个binding对象。如果给定了一个binding对象,求解的过程会在binding对象的上下文中执行。

hello = "hello world"
puts eval("hello") #=> "hello world"
proc = lambda { hello = "goodbye world"; binding }
eval("hello", proc.call) #=> "goodbye world"

http://tech.it168.com/d/2007-09-07/200709071737579.shtml
分享到:
评论

相关推荐

    Ruby中Block和迭代器的使用讲解

    主要介绍了Ruby中Block和迭代器的使用,是Ruby入门学习中的基础知识,需要的朋友可以参考下

    深入讲解Ruby中Block代码快的用法

    主要介绍了深入讲解Ruby中Block代码快的用法,block是Ruby学习进阶当中的重要知识,需要的朋友可以参考下

    深入理解Ruby中的代码块block特性

    在Ruby中,block并不罕见。官方对block的定义是“一段被包裹着的代码”。当然,我觉得这样的解释不会让你变的更明白。 对block的一种更简单的描述是“一个block就是一段存储在一个变量中的代码,它和其他的对象一样...

    Ruby中的block、proc、lambda区别总结

    在规则引擎中,Ruby 的闭包使用特别...Ruby 的哲学之一:同一个问题现实中有多种解决方法,所以 Ruby 中也有多种解法,所以闭包的使用也有多种方法。 先看一个代码的例子: Example 1: 代码如下: def foo1  yield end

    Ruby中的block代码块学习教程

    块变量:以yield关键字调用block也可以传递参数,block中竖线(|)之间给出的参数名用于接收来自yield的参数。  竖线之间(如上例中的 | i |)的变量被称作块变量,作用和一个正常方法的参数一样 2、掌握代码块的编写 ...

    Ruby常见面试题.pdf

    9. 什么是Ruby中的块(Block)和迭代器(Iterator)?请简要介绍在Ruby中块和迭代器的概念。 10. 在Ruby中如何进行模块(Module)和类(Class)的定义?请说明在Ruby中模块和类的创建方法。 11. 什么是Ruby中的符号...

    Ruby中使用Block、Proc、lambda实现闭包

    闭包(Closure),是指未绑定到任何对象的自由代码,闭包中的代码与任何对象...这段代码,我们使用了Array对象的block方法,将ary中的每个元素平方一把。从例子中我们可以看到block使用起来很方便,想必传统的Java以及

    深入理解Ruby中的block概念

    Ruby 里的 block一般翻译成代码块,block 刚开始看上去有点奇怪,因为很多语言里面没有这样的东西。事实上它还不错。 First-class function and Higher-order function First-class function 和 Higher-order ...

    Ruby菜鸟入门指南.md

    8. 块(Block)的概念及使用方式,用于扩展方法功能。 9. 迭代器的使用方式,如each, collect等,代替了常见的for循环。 10. 真假值的规则。 总的来说,这份指南介绍了Ruby作为一种纯面向对象语言的一些核心理念和语法...

    ruby语法基础教程

    §13.3.7 Ruby中YAML的使用 99 第十四章 安全控制 100 §14.1 0级 101 §14.1 1级 101 §14.2 2级 101 §14.3 3级 101 §14.4 4级 101 第十五章 单元测试 101 §15.1 什么是单元测试 101 §15.2 Ruby单元测试框架 ...

    multi_block:将多个块传递给 Ruby 方法

    MultiBlock 是一个迷你框架,用于将多个块传递给方法。 它使用以简单的语法完成此操作。 接收方法可以产生所有块,也可以只调用特定的块,由顺序或名称标识。 安装 添加到 Gemfile: gem 'multi_block' 用法 ...

    block-editor:Ruby on Rails 的块编辑器

    Ruby on Rails 的块编辑器 这个编辑器使用来自包来为 Rails 构建一个独立的块编辑器。 这个编辑器是从中提取出来的,它是按照构建的。 编辑器当前使用 v9.2.1 Gutenberg 发行包,它是 Wordpress v5.6 发行版的一...

    atom-ruby-block-converter:转换Ruby块样式

    它在当前行中查找第一个起始块,然后向上。 成功后,它看起来正确,然后向下搜索匹配的}或结束。 当一个块只有一行代码时:卷曲转换器将块连接到一行上; 终端转换器将三行分开,然后自动制表。 它只会尝

Global site tag (gtag.js) - Google Analytics