Ruby的动态语言特性和强大的meta-programming模型一直是让我这种Java程序员唏嘘感慨。看着RoR可以实现那么多魔术般的事情而不费吹灰之力,我着实想好好学学Ruby的meta-programming。可惜这方面资料好像比较少(至少我是没有找到什么好的,JavaEye这里讨论的也不多),我只能硬着头皮自己慢慢摸索。这篇文章只能算是一个最简单的入门,给大家展示一下Ruby中的meta-programming大概是什么样子。
下面代码大概会做一下事情:
- 根据指定的txt文件动态创建一个class,例如“people.txt”会被创建为People。
- txt文件的第一行是以“,”分隔的字符串,我会把它们作为class的属性动态加入class。
- 动态声明class的initialize方法和to_s方法。
代码如下:
ruby 代码
- class MetaProgrammingTest
-
-
- def self.create_class(file_name)
-
- class_name = File.basename(file_name,".txt").capitalize
-
- klass = Object.const_set(class_name,Class.new)
-
-
- first_line = ''
- File.open(file_name) { |io| first_line = io.gets.chomp }
- names = first_line.split(",")
-
-
- klass.class_eval do
-
-
- attr_accessor *names
-
-
-
- define_method(:initialize) do |*values|
-
- names.each_with_index do |name,i|
- instance_variable_set("@"+name, values[i])
- end
- end
-
-
-
-
- define_method(:to_s) do
- str = "[#{self.class}:"
- names.each {|name| str << " #{name}=#{self.send(name)}" }
- str + "]"
- end
-
- end
-
-
- klass
- end
-
- end
-
-
- klass = MetaProgrammingTest.create_class('people.txt')
- klass_instance = klass.new('001', 'Allen Young', 23)
- puts klass_instance.to_s
-
- puts klass_instance.inspect
-
怎么样?真的是非常强大吧。如果什么时候,Java也能有这么强大的meta-programming就好了。
分享到:
相关推荐
文章发布于,通过对比JS Entry,完整介绍了HTML Entry的原理,实际...-- mark the entry script with entry attribute --> < script src =" https://unpkg.com/mobx@5.0.3/lib/mobx.umd.js " entry > </ sc
标记之前添加滑块JS 将[removed]和代码添加到functions.php或代码片段短代码[instafeed user="ATTRIBUTE_NAME"] 要使用grid = [instafeed user =“ feed-grid”],请使用滑块= [instafeed user =“ feed-slider”] ...
首先通过git克隆仓库并安装依赖项: git clone --depth 1 --single-branch https://github.com/shivammakwan/node-sequelize-starter.git your-project-name cd your-project-name npm install 关注自述文件 将.env...
将require-duplicate添加到.eslintrc配置文件的plugins部分。 您可以省略eslint-plugin-前缀: { " plugins " : [ " require-duplicate " ] } 然后在“规则”部分下配置要使用的规则。 { " rules " : { " ...
+ 工具里新增merge和param两个函数 * unique和trim的返回值有误 2009-01-28 16:46:25 +0800 * bind的说明里多了个I * hide,toggle的callback参数类型为FunctionFunction * show,hide,toggle的callback参数为...
Gnucash转Beancount转换器 将您的Gnucash Sqlite3文件转换为Beancount文本分类帐。 需要Python 3.3+ 安装 pip install gnucash-to-beancount ... 测试仍然是使用diff和黄金文件的原始方法。 如果test.sh没有
将此行添加到应用程序的 Gemfile 中: gem 'idolmaster-cinderella-girls' 然后执行: $ bundle 或者自己安装: $ gem install idolmaster-cinderella-girls 用法 require 'idolmaster-cinderella-girls' ...
* [attribute!=value] jQuery 1.3中意义改变 * load 的data参数在jQuery 1.3中也可以接受String + ajax的error回调的第二个参数可能值"timeout", "error", "notmodified" 和 "parsererror" + ajax参数xhr * animate ...
Each affected Element gets a uniq class-attribute and its own style-sheet to draw the Element. These are the steps that the script does: 1. given the CSS ```css header { --myColor:red; } main { -...
已注册 ,我们对其进行了扩展以定义所需的LDAP对象OID :1.3.6.1.4.1.39430.1.2.1 ObjectClass :ownCloud配额字段ownCloud可以读取LDAP属性并根据其值设置用户配额。 该属性应返回人类可读的值,例如“ 2 GB”。 ...
babel-plugin-remove-react-jsx-attribute安装 npm install --save-dev babel-plugin-remove-react-jsx-attributeyarn add -D babel-plugin-remove-react-jsx-attribute介绍这对于删除不需要转译的 JSX 属性很有用。...
在可视化领域,LineUp是一种很好的多属性分析的工具,本论文详细讲了如何用Lineup组件来做可视分析。仅供参考。
适用于Ruby的TaxJar销售税API 到TaxJar Ruby接口。 TaxJar使在线卖家和商人的营业税申报更加容易。... model_attribute-非ActiveRecord模型的类型转换属性。 安装 将此行添加到您的应用程序的Gemfile中:
aws dynamodb create-table --table-name BlogsTable --attribute-definitions AttributeName=id,AttributeType=S --key-schema AttributeName=id,KeyType=HASH --billing-mode PAY_PER_REQUEST --endpoint-url ...
python3 server.py 127.0.0.1 8888 ...AttributeError: module ‘os’ has no attribute ‘exit’ 部分代码入下: from socket import * import sys,os #实现登录 def do_login(s,user,name,addr): for i in user: i
Iris Plants Database ==================== ... :Class Distribution: 33.3% for each of 3 classes. :Creator: R.A. Fisher :Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov) :Date: July, 1988
GUI 策略生成器的 GUI 反过来被 CPABE 使用 - Ciphertext-Policy Attribute-Based Encryption[1] 模块加密数据先决条件: Python 2.7 特金特tk 完成先决条件后,运行: python create_policy.py并按照向导说明进行...
然后,在您的数据集路径下创建一个名为“attribute”的文件夹,并将相应的注释放入该文件夹中。 例如, ├── dataset │ ├── DukeMTMC-reID │ ├── bounding_box_test │ ├── bounding_box_train │ ├─...
AttributeDependsCalculator将帮助您解决问题要求Ruby 2.0以上Rails 4.0+安装将此行添加到您的应用程序的Gemfile中: gem 'attribute-depends-calculator' 然后执行: $ bundle用法假设您有模型订单和订单项class ...
文件共享系统中属性可添加/撤销的属性基加密方案,李晖,郭利君,在原来密文策略属性加密方案的基础上,本文提出了一个高效、灵活的属性加密方案。该方案不仅减少了密钥和密文的长度,而且通过更