ruby是动态语言,它有动态语言的优势与劣势

动态语言,像python与ruby 你不用提前去定义method - they need to only be "found" when invoked

calling method dynamically:

class Dog
def bark
puts "Woof, woof!'
end
def greet(greeting)
puts greeting
end
end dog = Dog.new
dog.bark # => Woof, woof!
dog.send("bark") # => Woof, woof!
dog.send(:bark) # => Woof, woof!
method_name = :bark
dog.send method_name # => Woof, woof! dog.send(:greet, "hello") # => hello

  Dynamic Dispatch:

  不需要call method 用 xxx.xxx

  能用string和symbol call methods dynamically

优点:*can decide at runtime which methods to call

*The code doesn't have to find out until runtime which method it needs to call

Dynamic method:

class Whatever
define_method :make_it_up do
puts "Whatever..."
end
end whatever = Whatever.new
whatever.make_it_up # => Whatever...

写动态方法能有效降低code量

require_relative 'store'
class ReportingSystem def initialize
@store = Store.new
@store.methods.grep(/^get_(.*)_desc/) { ReportingSystem.define_report_method_for $1 )
end def self.define_repot_methods_for (item)
define_method ("get_#{item}_desc") {@store.send("get_#{item}_desc) }
define_method ("get_#{item}_price") {@store.send("get_#{item}_desc) }
end
end r3 = ReportingSystem.new
puts "#{rs.get_piano_desc} costs #{rs.get_piano_price.to_s.ljust(6.'0')}" # => Excellent piano costs 120.00

Ghost method:

如果我们使用了不存在的method,会自动跳转到method_missing  method,不过method_missing 可以被复写:

class Mystery
#no_methods defined
def method_missing (method, *args)
puts "Looking for..."
puts "\"#{method}\" with params {#{args.join(',')}} ?"
puts "Sorry... He is on vacation... "
yield "Ended up in method_missing" if block_given?
end
end m = Mystery.new
m.solve_mystery("abc", 123123) do |answer|
puts "And the answer is: #{answer}"
end # => Looking for...
# => "solve_mystery" with params (abc,123123) ?
# => Sorry... He is on vacation...
# => And the answer is: Ended up in method_missing

* method_missing gives you the power to "fake" the methods

* 这被叫做ghost methods 是因为 它并不真正意义上的存在

*ruby built-in classes use method_missing and dynamic methods all over the place...

Struct and OpenStruct:

Struct: 特定类的生成器,每个类都被定义为保存一组变量及其访问器(动态
方法)

OpenStruct: 对象(类似于Struct),其属性在第一次分配时动态创建(“Ghost方法”)。

Customer = Struct.new(:name, :address) do #block is optional
def to_s
"#{name} lives at #{address}"
end
end
jim = Customer.new("Jim", "-1000 wall Street")
puts jim # => Jim lives at -1000 wall Street require 'ostruct' # => need to require ostruct for OpenStruct some_obj = OpenStruct.new(name: "Joe", age: 15)
some_obj.sure = "three"
some_obj.really = "yes, it is true"
some_obj.not_only_strings = 10
puts "#{some_obj.name} #{some_obj.age} #{some_obj.really}"
#=> Joe 15 yes,it is true

method_missing and Performance:

因为调用是直接的,所以可能会慢一些,但大多数情况下不影响。

如果考虑响应速度的话,可以考虑hybird approach

*Define a real method from inside method missing after an attempted ‘call’

Ghost methods allow you to call methods as if they are there even though they are not
Method behavior can be defined at runtime , for example based on database columns existing or not .

RoR - MetaProgramming的更多相关文章

  1. C++模板元编程(C++ template metaprogramming)

    实验平台:Win7,VS2013 Community,GCC 4.8.3(在线版) 所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能力,模板使 C++ 编程变得 ...

  2. .Net元编程【Metaprogramming in NET】 序-翻译

    最近在看这本书,比较实用.抽点时间把公开的部分内容简单的翻译了一下,下文是序部分. 书的具体地址为: http://www.amazon.cn/Metaprogramming-in-NET-Hazza ...

  3. ror 在windows下开发的坑

    虽然知道ror在windows下的坑很多很多,但是目前没有先将就入门学习,也不折腾了.后面等待新机器来了,用linux来搭平台,先记录一下遇到的坑. 1.views/layouts/applicati ...

  4. 最新RubyMine2016.2开发Ruby ON Rails(ROR)程序的流程

    1.RubyMine新建ROR工程 File->New Project     选择Rails下的"New Application"     点击OK 后生成ROR项目   ...

  5. ROR 环境的 搭建

    1)安装RUBY:从 http://www.ruby-lang.org/en/ 下载 ruby182-15.exe,安装Ruby.ruby -v 看是否安装成功.2)安装RAILS框架 :gem in ...

  6. CppCon - Modern Template Metaprogramming 杂记

    2014年底才看到github和channel9上有CppCon2014的视频和资料,顿时激动不已.最近小生也一直在研习CppCon2014中令人兴奋的内容.这篇鄙文就是小生学习了<Modern ...

  7. Ror初学笔记

    Ror正在以惊人的速度增长着,特别是在常常光顾JavaEye的时候发现Ror已经在国内有非常好的基础了,当然要凑个热闹尝尝鲜 咯. 眼下国内Ror的中文资料还是非常少的,到网上找找就仅仅有Eiffel ...

  8. Ruby on Rails (ROR)类书籍

    Ruby on Rails (ROR)类书籍下载地址及其他(整理) Ruby on Rails 如此之热,忍不住也去看了看热闹,现在把一些相关的电子图书下载地址整理下,方便有兴趣的朋友. 2006-0 ...

  9. javascript加RoR实现JSONP

    我们知道不同域中的js代码受同源策略的限制,不同域中的AJAX同样受此限制,不过使用html中的script远程脚本可以跳过该限制,下面我们实际看一下利用RoR和js如何实现所谓的JSONP. 这里只 ...

随机推荐

  1. wamp 在本地安装PHP环境, 开启 curl 扩展

    分别打开以下 2 个文件: wamp\bin\php\(your php version)\php.ini wamp\bin\Apache\(your apache version)\bin\php. ...

  2. Mybatis(二) 全局配置文件详解

    这节来说说全局配置文件的东西,非常简单.看一遍就懂了. --WH 一.全部配置内容 SqlMapConfig.xml的配置内容和顺序如下,顺序不能乱.现在来对这些属性的意思一一进行讲解. 二.prop ...

  3. CNN(卷积神经网络)、RNN(循环神经网络)、DNN,LSTM

    http://cs231n.github.io/neural-networks-1 https://arxiv.org/pdf/1603.07285.pdf https://adeshpande3.g ...

  4. 交换上的FLAPPING事件 (zhuan)

    今天在学校的一个三层交换上看到持续的日志信息: Host 00:E0:FC:09:BC:F9is flapping between fa0/x and fa0/y. 思科对此官方的解释是: Error ...

  5. 使用python脚本实现iOS图片资源压缩

    最近公司有一个新的需求,要把代码进行瘦身,这篇博客记录下如何对图片进行压缩的. 原理: 写一个脚本,把图片文件夹'.xcassets'的所有文件遍历出来,然后使用一个第三方的算法把图片压缩后再替换回去 ...

  6. C++笔试面试题整理

    朋友给出的一些常见的C++面试题,特整理如下,后期遇到新的再更新. 面试题 列举并解释C++中的四种运算符转化,说明它们的不同点: static_cast: 在功能上基本上与C风格的类型转换一样强大, ...

  7. 利用Python写入CSV文件的方法

    第一种:CSV写入中文 #! /usr/bin/env python # _*_ coding:utf- _*_ import csv csvfile = file('test.csv', 'wb') ...

  8. PHP 合并有序数组

    <?php //两个有序数组合并 $arr1 = [1,5,7,44,66,89]; $arr2 = [4,5,6,88,99,105,111]; $arr3 = []; $l1 = count ...

  9. 【消灭代办】第4周 - Echarts在移动端的各种填坑姿势

    啊呀呀呀呀...... 2018-12-03 代办一:坐标指示器相关问题: 见另一篇 第二问:https://www.cnblogs.com/padding1015/p/9936533.html 20 ...

  10. 在POM配置Maven plugin提示错误“Plugin execution not covered by lifecycle configuration”的解决方案

    eclipse在其POM文件的一处提示出错如下: Plugin execution not covered by lifecycle configuration: org.apache.maven.p ...