Tag: 方法缺失

Rails:调用“id”主键方法时出现“Stack level too deep”错误

这是另一个问题的转贴,这次更好地隔离了。 在我的environment.rb文件中,我改变了这一行: config.time_zone = ‘UTC’ 到这一行: config.active_record.default_timezone = :utc 从那以后,这个电话: Category.find(1).subcategories.map(&:id) 在config.cache_classes = false后第二次在开发环境中运行时,“堆栈级太深”错误失败。 如果config.cache_classes = true,则不会发生此问题。 该错误是第252行的active_record / attribute_methods.rb中的以下代码的结果: def method_missing(method_id, *args, &block) … if self.class.primary_key.to_s == method_name id …. 对“id”函数的调用会重新调用method_missing,并且没有任何东西阻止id被反复调用,从而导致堆栈级别太深。 我正在使用Rails 2.3.8。 Category模型has_many:subcategories。 调用在上面那行的变体上失败(例如,Category.first.subcategory_ids,使用“each”而不是“map”等)。 任何想法将受到高度赞赏。 谢谢! 阿米特

我编写的“编程Ruby”中的method_missing

method_missing的 * obj.method_missing(符号h, args i)→other_obj 当obj被发送一个它无法处理的消息时,由Ruby调用。 symbol是被调用方法的符号,args是传递给它的任何参数。 下面的示例创建一个Roman类,它响应名称由罗马数字组成的方法,返回相应的整数值。 method_missing的更典型用法是实现代理,委托和转发器。 class Roman def roman_to_int(str) # … end def method_missing(method_id) str = method_id.id2name roman_to_int(str) end end r = Roman.new r.iv ! 4 r.xxiii ! 23 r.mm ! 2000 我刚刚听说缺少方法,并在Ruby编程中找到了更多信息,但本书引用的上述解释已经超出了我的想法。 有没有人有更简单的解释? 更具体地说,方法缺失只是由解释器使用,或者是否需要直接在程序中调用它(假设我只是编写Web应用程序,而不是为NASA编写代码)?

使用Ruby来解析Tcl DSL

我希望能够解析一些Tcl代码,其中参数不被字符串包围。 考虑一下这个tcl代码: proc foo {name} { puts “Foo –> $name” } foo bar 对于那些不熟悉Tcl的人来说, foo是方法名称, bar是参数(引号在Tcl中是可选的)。 以前的代码将输出: Foo –> bar 是否有可能使用ruby解析完全相同的输入( bar仍未加引号)? 等效的ruby代码是: def foo(name) puts “Foo –> #{name}” end tcl = <<-TCL.gsub(/^\s+/, "").chop foo bar TCL instance_eval(tcl) 当然,当它到达bar时会失败,因为它预计会被引用。 我尝试过修改method_missing def method_missing(meth, *args) puts meth.to_s + ” –> args.to_s end 但它以相反的顺序解析: to_hash –> [] bar […]