闭包的例子一般是在说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"
分享到:
相关推荐
在core_cm3.h中有如下定义: /* define compiler specific symbols */ #if defined ( __CC_ARM ) #define __ASM __asm /*!*/ #define __INLINE __inline /*!*/ #elif defined ( __ICCARM__ ) #define __ASM _...
用于fluent中模拟物面变形运动的udf,用到Define_Grid_Motion
DEFINE_DPM_EROSION用于fluent UDF磨损
动网格,DEFINE_CG_MOTION,DEFINE_GRID_MOTION,很好的模板
需要安装rBench进行测试 gem install rbench 博文链接:https://yapex.iteye.com/blog/220596
fluent DEFINE_CG_MOTION实现动网格计算
动网格,DEFINE_CG_MOTION,DEFINE_GRID_MOTION,很好的模板(dynamic mesh good template)
使用send , define_method和method_missing遍历不同的元编程技术 将您的思维扩展到元编程,并让您考虑可以在自己的代码中利用它的地方 设置 要求 该讲习班是使用Ruby 1.9.3创建的,但是在2.1.2版本中有效。 假设您...
一个用C语言实现的FTP客户端,包含上传、下载、目录列表、删除、文件列表等功能。
define _CRT_SEC.docx
Used in Fluent
使用define_method创建Ruby 内置attr_accessor方法的布尔版本。代码片段: 使用define_method attr_accessor方法 def self . attr_accessor? ( attr ) read_method = " #{ attr } ?" write_method = " #{ attr } =...
数据结构 c语言描述的源码 头文件:/* * filename: dsdef.h * description: This head file includes ...#define __STRING_H__ #endif #if !defined(__DSDEF_H__) #define __DSDEF_H__ 。。。。。。。。。。。。。
主要介绍了C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_的区别的相关资料,需要的朋友可以参考下
AIX define_host.and so on
fluent软件中采用DEFINE_CG_MOTION动网格的udf程序
利用ENVI进行图层重采样程序,c#中可以正常调用
define_能量源项_动量udf_udf_激光焊接Fluent_激光焊接.zip
define_能量源项_动量udf_udf_激光焊接Fluent_激光焊接_源码.zip