【问题标题】:Parent class definition with arguments带参数的父类定义
【发布时间】:2013-08-06 15:04:56
【问题描述】:

我在浏览camping 文档时遇到了这个定义控制器的示例:

class Digits < R '/nuts/(\d+)'
  def get(number)
    "You got here by: /nuts/#{number}"
  end
end

看起来这个类定义正在做的是将一个字符串参数传递给R 超类。但是,我查看了camping 代码库,并没有看到R 被定义为一个类了。它被定义为这样的方法:

def R(c,*g)
  p,h=/\(.+?\)/,g.grep(Hash)
  g-=h
  raise "bad route" if !u = c.urls.find{|x|
    break x if x.scan(p).size == g.size && 
      /^#{x}\/?$/ =~ (x=g.inject(x){|x,a|
        x.sub p,U.escape((a.to_param rescue a))}.gsub(/\\(.)/){$1})
  }
  h.any?? u+"?"+U.build_query(h[0]) : u
end

以及实际处理路由的方法:

def /(p); p[0] == ?/ ? @root + p : p end

我不明白这是如何工作的,因为当我尝试创建一个类并将一个方法定义为超类时,如下所示:

def doSomething(boo)
    puts boo
end

class Someclass < doSomething 'boo'
end

我收到此错误:

(eval):60: (eval):60: superclass must be a Class (NilClass given) (TypeError)

有人能指出我在 ruby​​ 文档中的哪个地方介绍了此功能(使用方法作为超类)吗?我不知道如何称呼这个功能,所以我的谷歌搜索真的找不到任何东西。

【问题讨论】:

    标签: ruby camping


    【解决方案1】:

    你必须从你的方法中返回一个类:

    def doSomething(boo)
      Class.new { define_method(:boo) { boo } }
    end
    
    class SomeClass < doSomething 'boo'
    end
    
    SomeClass.new.boo # => 'boo'
    

    您也在寻找错误的方法。 Camping 在 Controller 上有一个名为 R 的类方法(这是定义控制器时使用的方法),在 Base 上有一个名为 R 的实例方法(用于生成路由)。这是实际定义:https://github.com/camping/camping/blob/ae5a9fabfbd02ba2361ad8831c15d723d3740b7e/lib/camping-unabridged.rb#L551

    【讨论】:

      猜你喜欢
      • 2017-03-18
      • 2013-01-24
      • 2021-11-16
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 2017-09-13
      相关资源
      最近更新 更多