ruby 元编程 method_missing send

  • method_missing,顾名思义,在方法找不到时被调用。有了这个强大元编程工具,我们就能创建动态的方法,比如ActiveRecord中的动态finder
class Legislator
  # Pretend this is a real implementation
  def find(conditions = {})
  end

  # Define on self, since it's  a class method
  def self.method_missing(method_sym, *arguments, &block)
    # the first argument is a Symbol, so you need to_s it if you want to pattern match
    if method_sym.to_s =~ /^find_by_(.*)$/
      find($1.to_sym => arguments.first)
    else
      super
    end
  end
end
  • send,也是一个动态方法调用的强大工具,它的作用的将一个方法以参数的形式传递给对象。 ``` class Box def open_1 puts “open box” end

    def open_2 puts “open lock and open box” end

    def open_3 puts “It’s a open box” end

    def open_4 puts “I can’t open box” end

    def open_5 puts “Oh shit box!” end end

box = Box.new

box.send(“open_#{num}”) ```

最近的文章

ruby DSL

Creating a Ruby DSL归纳笔记借用 Creating a Ruby DSL 这篇文章中的例子,假设我们想写一段 HTML 代码:<html> <body> <div id="container"> <ul class="pretty"> <li class="active">Item 1</li> <li>Item 2</li> ...…

继续阅读
更早的文章

Go 里的 make 和 new 两个函数,how to use?

注:该文作者是 Dave Cheney,原文地址 Go has both make and new functions, what gives ?这篇博客主要是讨论 Go 的内建函数 make 和 new。如 Rob Pike 在今年的 Gophercon 上提到的,Go 有多种方式初始化变量。其中之一的能力就是获取一个 struct literal 的地址,这导致了几种方式做同样的事情。s := &SomeStruct{}v := SomeStruct{}s := &...…

继续阅读