闭包的例子一般是在说ruby的块,特片是:访问本地变量和绑定运行上下文(很强大的两点)
nums = [10,3,22,34,17]
sum = 0
nums.each{|n| sum += n}
print sum
近来看mongoid的代码,发现define_method也能绑定运行上下文!
def getter(name, metadata)
tap do
define_method(name) do |*args|
reload, variable = args.first, "@#{name}"
options = options(args)
if instance_variable_defined?(variable) && !reload
instance_variable_get(variable)
else
build(
name,
@attributes[metadata.key],
metadata,
options.merge(:binding => true, :eager => metadata.embedded?)
)
end
end
end
end
定义的getter方法中绑定了当时metadata类实例!这样应用不用再额外做映射表,来维护方法与其它对象的关系,正如有栈系统帮我们存函数出入参数。
写了一个简单示意方法:
class Metadata
attr_accessor :relation_name
end
module Accessor
def build(name, metadata)
p name, metadata, metadata.relation_name
end
module ClassMethods
def getter(name, metadata)
tap do
define_method(name) do
build(
name,
metadata
)
end
end
end
end
end
class Doc
include Accessor
extend Accessor::ClassMethods
end
meta = Metadata.new
meta.relation_name = 'embeds_one'
Doc.getter("ss_car", meta)
# p Doc.public_instance_methods
Doc.new.ss_car
meta2 = Metadata.new
meta2.relation_name = 'ref_one'
Doc.getter("ss_bus", meta2)
Doc.new.ss_bus
输出:
"ss_car"
#<Metadata:0x00000100846f38 @relation_name="embeds_one">
"embeds_one"
"ss_bus"
#<Metadata:0x00000100846128 @relation_name="ref_one">
"ref_one"
分享到:
相关推荐
- **动态方法定义**:假设有一个应用程序需要动态地根据用户的输入来定义新方法,可以使用`define_method`轻松实现这一点。 ```ruby class Calculator def self.define_operation(operation_name, &block) ...
Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。本教程将带你深入理解Ruby的基础知识,并通过代码示例帮助你快速上手。 一、Ruby语言基础 1. 变量:Ruby中的变量分为...
元编程能力允许我们编写代码来操纵代码本身,例如`define_method`可以动态定义方法。 9. **常量(Constants)** 常量以大写字母开头,一旦被赋值,其值在整个作用域内是不可变的。然而,常量的引用路径可能改变,...
- Ruby的元编程能力强大,可以在运行时修改类和对象的行为。 - eval()函数可以执行字符串形式的代码,define_method动态定义方法。 7. **Rails框架**: - Ruby on Rails是Ruby最著名的Web开发框架,它遵循MVC...
1. **方法定义**:Ruby允许在运行时定义新方法,如`define_method`。这个方法接受一个符号作为方法名和一个代码块,然后在指定的对象或类上创建一个新方法。 2. **类和模块的开放性**:Ruby的类和模块在运行时可以...
综上所述,Ruby的元编程特性提供了强大的代码动态性,使得我们可以更灵活地编写和调整程序。通过`eval`, `send`, `instance_eval`, `class_eval`, 动态方法定义,以及`Proc`和`Lambda`等工具,开发者能够创建出更具...
Ruby是一种面向对象的、动态类型的编程语言,由日本的松本行弘(Yukihiro Matsumoto)创立,因其简洁优雅的语法和强大的元编程能力而备受开发者喜爱。《Ruby基础教程(中文第四版)》是深入学习Ruby语言的重要参考资料...
Ruby是一种动态、面向对象的脚本语言,以其简洁、优雅的代码风格和强大的元编程能力而闻名。这本书旨在帮助读者迅速掌握Ruby的关键元素,以便在实际项目中高效运用。 1. **变量和数据类型** - Ruby支持多种变量...
Ruby以其简洁、优雅的语法和强大的元编程能力而闻名,它强调程序员的生产力和代码的可读性。在Ruby-2.5.8版本中,我们可以探讨以下几个关键知识点: 1. **版本号的意义**:Ruby的版本号通常由主版本号、次版本号和...
Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。本使用文档详尽地介绍了Ruby的API类库,是学习和掌握Ruby编程的重要资源。以下是一些关键知识点的概述: 1. **变量与...
Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。源代码是任何编程语言的核心,它包含了程序的逻辑和实现细节。在Ruby的世界里,源代码通常是`.rb`文件,它们由一系列的...
3. **块、迭代器和闭包**:Ruby的块、迭代器和闭包是其强大之处,它们使得代码更简洁且可读性更强。比如,`each`迭代器和`yield`关键字在处理集合时非常实用。 4. **元编程**:Ruby的元编程能力使其可以在运行时...
Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。本开发文档将深入探讨Ruby的核心概念、语法特性、类与对象、方法、模块和混合、数组、哈希、控制结构、异常处理、文件与...
Ruby是一种面向对象的脚本语言,以其简洁、优雅的语法和强大的元编程能力著称。在"Ruby学习指南"这个压缩包中,很显然,它包含了一系列关于Ruby编程的资源,可能包括教程、代码示例或者项目实践。下面,我们将深入...
5. **元编程**:Ruby提供了`class`, `module`, `define_method`, `method_missing`等工具,允许在运行时创建和修改类和模块,实现自省和自定义行为。 6. **Gem生态系统**:Ruby拥有庞大的Gem库,这是一个开源软件包...
将学习到`eval`、`send`、`define_method`等元编程技巧。 8. **块、 Proc 和 Lambda**:Ruby中的块、Proc和Lambda是函数式编程的重要元素,它们用于定义匿名函数和闭包。 在提供的源代码文件(E9-1.rb、E3.10-5.rb...
Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。这份"ruby中文文档"是为初学者量身定制的资源,旨在帮助新手快速入门并深入理解Ruby的核心概念。 文档可能涵盖以下知识...
7. **Closures和Blocks**:Ruby的块(Blocks)和闭包(Closures)是强大的功能,它们允许函数式编程风格和匿名函数。在元编程中,块常用于构建可定制的行为。 8. **类对象和类方法**:Ruby中的类本身也是对象,因此...
Ruby是一种动态、面向对象的脚本语言,以其简洁、优雅的语法和强大的元编程能力著称。 在Ruby 1.9和2.0这两个版本中,语言有许多关键性的改进和优化。例如,1.9版本引入了Unicode字符串处理,提高了对字符串编码的...
这本书详细介绍了如何利用Ruby的强大元编程特性来提升代码的灵活性、可扩展性和简洁性。元编程允许程序员在运行时修改或创建程序结构,使得代码能够自我描述和自我修改,极大地增强了编程的动态性和创造性。 Ruby元...