# cool dynamic method usage
class MyClass
define_method :my_method do |my_arg|
my_arg * 8
end
end
m = MyClass.new
p m.my_method 8
p m.send(:my_method, 9)# a more complicated example
puts "============== Example ==============="
# Dynamic Example
# Dynamic Model
class MOUSE
attr_accessor :price, :info, :c_id
def initialize price, info, c_id
@price, @info, @c_id = price, info, c_id
end
end
class CPU
attr_accessor :price, :info, :c_id
def initialize price, info, c_id
@price, @info, @c_id = price, info, c_id
end
end
class KEYBOARD
attr_reader :price, :info, :c_id
def initialize price, info, c_id
@price, @info, @c_id = price, info, c_id
end
end
# Dynamic Method DS
class DS
def initialize
@data = []
end
def addCom *component
component.each{|c| @data << c }
end
def count
@data.count
end
class << DS
def define_get_method *component_name
component_name.each do |each|
%w-_info _price-.each do |content|
define_method ("get_" + each.to_s + content).to_sym do |c_id|
comArray = @data.select{|x| x.c_id == c_id}
com = comArray.select{|x| x.is_a? eval(each.to_s.upcase)}
com[0].send(content[1..-1])
end
end
end
end
end
define_get_method :mouse, :keyboard, :cpu
end
#data prepare
k1 = KEYBOARD.new 10, "keyboard_1", 1
k2 = KEYBOARD.new 40, "keyboard_1", 2
k3 = KEYBOARD.new 100, "keyboard_1", 3
c1 = CPU.new 200, "cpu_1", 1
m1 = MOUSE.new 1000, "apple Inc", 1
ds = DS.new
ds.addCom k1, k2, k3, c1, m1
p ds.count
p (ds.get_mouse_info 1), (ds.get_mouse_price 1)
p ds.get_keyboard_info 1
p ds.get_cpu_info 1
# more about dynamic method
class Computer
def initialize computer_id, data_source
@id = computer_id
@data_source = data_source
data_source.methods.grep(/^get_(.*)_info$/){Computer.define_component $1}
end
def self.define_component name
define_method(name){
info = @data_source.send "get_#{name}_info", @id
price = @data_source.send "get_#{name}_price", @id
result = "#{name.capitalize}: #{info} $#{price}"
return "**#{result}" if price > 500
result
}
end
end
puts "-----------------final invoke..-----------------"
c = Computer.new 1, ds
p c.keyboard
p c.mouse
分享到:
相关推荐
阅读元编程Ruby欢迎!...[](https://github.com/<YOUR>/reading-metaprogramming-ruby/workflows/Ruby/badge.svg?branch=<YOUR>) 为分叉存储库启用GitHub操作只需按绿色按钮,就可以了到目前为止进行的更改该存储
Metaprogramming is one of Elixir's greatest features. Maybe you've played with the basics or written a few macros. Now you want to take it to the next level. This book is a guided series of ...
标题中的“tiny-metaprogramming-library”是一个小型的元编程库,旨在提供一个实际的、易于理解的示例,帮助开发者学习和掌握元编程技术,特别是对于那些正在成长中的库来说,这种库能为设计和实现带来更高的灵活性...
C++.Template.Metaprogramming.-.companion.cd.rar
三角分类实验室 目标 定义一个自定义错误并使用它。 指示 编写一个Triangle类,该类在初始化时接受三个参数。 每个自变量都是三角形的三个边之一的长度。 给你的三角形的实例方法, kind是回报,作为一个符号,它的...
总之,《Server Metaprogramming Ruby-Pyton-Groovy-Haskell-Erlang.pdf》这本书不仅介绍了元编程的基本概念,还深入探讨了五种具有代表性的动态语言在服务器端元编程方面的应用,并通过《Beyond Java》一书提供了对...
批量分配 目标 使用关键字参数定义一个初始化方法。 使用质量分配对初始化方法进行元编程。 指示 创建一个Person类,该类在初始化时接受哈希。 哈希键应符合以下属性: 允许的属性: :name , :birthday , :hair_...
批量分配目标使用关键字参数定义一个初始化方法。 使用质量分配对初始化方法进行元编程。指示创建一个Person类,该类在初始化时接受哈希。 哈希键应符合以下属性: 允许的属性: :name , :birthday , :hair_color , ...
元编程对话 简介(15分钟) 什么是露比? 什么是元编程 元编程概述 为什么很酷 元编程解决问题的示例 为什么它比实现目标的传统方法更好 简单代码示例 Rails中使用您可能没有意识到的元编程的宝石/示例 ...
第 10 周:创客学院在 Ruby 中玩转元编程挑战: 使用method_missing重新定义对象在询问has_unknown_attribute时的Reacthas_unknown_attribute 。 使用define_method创建Ruby 内置attr_accessor方法的布尔版本。代码...
Ruby 元编程演示 由 Leigh Halliday 创建 例子 在示例文件夹中找到。 查看演示文稿的说明 安装 安装 克隆reveal.js 存储库 $ git clone ... 导航到reveal.js文件夹 $ cd ruby-dsl-workshop ...
模板元编程教程示例在这里,我分享了有关模板元编程的系列使用的代码。 在文件中是我对帖子中介绍的一些练习的解决方案。 请注意,以后的一些帖子都依赖于模板元编程库,例如 。 这些文件需要兼容C ++ 11的编译器...
- **与静态类型的交互**:通过使用`dynamic`关键字和`System.Dynamic`命名空间中的类型,可以方便地在C#中调用动态语言的对象和方法。 ### 总结 通过对《Metaprogramming in .NET》的内容总结,我们可以看到.NET...
Addison Wesley - C++ Template Metaprogramming Concepts Tools And Techniques From Boost And Beyond
C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond By David Abrahams, Aleksey Gurtovoy Publisher : Addison Wesley Professional Pub Date : December 10, 2004 ISBN ...
这是C++ Template Metaprogramming原书附带的例子代码,可以方便各位进行研习,请首先编译开篇的第一个例子,以测试你手头的编译器对模板的支持程度。 另,有的亲反映上载的书无法打开,可能是Windows7进行了权限...
标题提到了"The Boost C++ Metaprogramming",意味着这篇文档关注的是在C++领域中,Boost库提供的模板元编程工具和相关技术。 描述部分强调了文档将讨论Boost C++模板元编程库,这是一个可扩展的编译时框架,包含...