标签: method-missing

默认的Ruby访问器方法?

是否有一个默认方法或类访问器,我可以添加到一个Ruby类,如果一个访问器(类似Ruby的属性)没有退出?然后,我可以编写一些自定义代码来回复,就像从数据库中读取的数组列表一样,可以像访问者一样访问值,而无需编写访问者代码(因为如果从数据库中读取它的未知数).

使用Ruby MRI 1.9

谢谢!

ruby method-missing

4
推荐指数
1
解决办法
1904
查看次数

为什么我从irb 1.9.3中的method_missing得到"堆栈级太深"?

场景:

-bash-3.2$ irb -f
ruby-1.9.3-p0 :001 > @v = {}
 => {} 
ruby-1.9.3-p0 :002 > def method_missing(sym, *args); @v[sym]; end
 => nil 
ruby-1.9.3-p0 :003 > a
(irb):2: stack level too deep (SystemStackError)
-bash-3.2$ 
Run Code Online (Sandbox Code Playgroud)

我用-f运行以避免加载任何irbrc的东西.当我输入时,我期待得到零a.发生了什么,是否有解决方法?我尝试abegin/ rescue Exceptionblock 包装,但没有做任何事情.

这也发生在1.9.2,但不是1.9.1.

更奇怪的行为:

-bash-3.2$ irb -f
irb(main):001:0> @v = {}
=> {}
irb(main):002:0> def method_missing(sym, *args); @v[sym]; end; 5.times { p a }
nil
nil
nil
nil
nil
=> 5
irb(main):003:0> a
(irb):2: stack level too deep …
Run Code Online (Sandbox Code Playgroud)

ruby irb method-missing

3
推荐指数
1
解决办法
1696
查看次数

Ruby - method_missing

我正在尝试实现一个用于将$转换为其他货币的method_missing,就像5.dollars产生5,5.yen将产生0.065 5.euro 6.56等等.我现在可以做.现在我需要实现它,但是以5.dollars.in(:yen)为例.

这就是我现在所拥有的:

class Numeric
  @@currencies = {'yen' => 0.013, 'euro' => 1.292, 'rupee' => 0.019}
  def method_missing(method_id)
    singular_currency = method_id.to_s.gsub( /s$/, '')
    if @@currencies.has_key?(singular_currency)
      self * @@currencies[singular_currency]
    else
      super
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释我怎么做到这一点?

PS:我宁愿你不给我代码,而是解释,所以我可以自己确定它是如何完成的.

ruby metaprogramming method-missing

3
推荐指数
2
解决办法
1万
查看次数

使用method_missing委派的方法的Arity

当我将类的实例上的方法委托A$delegation_target如下:

$delegation_target = ""
class A
  def method_missing *args, ≺ $delegation_target.send(*args, &pr) end
  def respond_to_missing? *args; $delegation_target.respond_to?(*args) end
end
Run Code Online (Sandbox Code Playgroud)

arity对实例的方法A回报-1,而不管arity对方法$delegation_target:

def $delegation_target.foo; end
A.new.method(:foo).arity # => -1

def $delegation_target.foo arg1; end
A.new.method(:foo).arity # => -1

def $delegation_target.foo arg1, arg2; end
A.new.method(:foo).arity # => -1

def $delegation_target.foo arg1, arg2, arg3; end
A.new.method(:foo).arity # => -1
Run Code Online (Sandbox Code Playgroud)

-1是从哪里来的?并且,有没有办法使它,以便,对于任何可能的方法名称m,A.new.method(m).arity返回$delegation_target.method(m)(如果它被定义)的arity ?

ruby delegation method-missing arity

3
推荐指数
1
解决办法
336
查看次数

红宝石.如何知道定义了哪个类实例方法?

我想知道定义了哪个类method_missing.它在Object中定义.

如何确定层次结构中的哪个类覆盖它?

ruby metaprogramming class instance method-missing

3
推荐指数
1
解决办法
137
查看次数

我编写的"编程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
Run Code Online (Sandbox Code Playgroud)

我刚刚听说方法缺失,并在Ruby编程中找到了更多信息,但本书引用的上述解释是我的头脑.有没有人有更简单的解释?更具体地说,方法缺失仅由解释器使用,或者是否需要直接在程序中调用它(假设我只是编写Web应用程序,而不是为NASA编写代码)?

ruby method-missing

2
推荐指数
3
解决办法
2735
查看次数

Erlang和method_missing

我来自Java和Ruby背景,我想知道在Erlang中是否有任何"method_missing"的等价物.我已经看过的文件,我可以看到的是使用erl_eval和erl_parse最接近的,但我想知道是否有任何其他方式?

erlang method-missing

2
推荐指数
1
解决办法
666
查看次数

Rails:使用关联时,不会在模型上调用method_missing

我目前的代码:

class Product < ActiveRecord::Base
  belongs_to :category
end

class Category < ActiveRecord::Base
  def method_missing name
    true
  end
end

Category.new.ex_undefined_method          #=> true
Product.last.category.ex_undefined_method #=> NoMethodError: undefined method `ex_undefined_method' for #<ActiveRecord::Associations::BelongsToAssociation:0xc4cd52c>
Run Code Online (Sandbox Code Playgroud)

这是因为rails中的这个代码只传递模型中存在的方法.

private
def method_missing(method, *args)
  if load_target
    if @target.respond_to?(method)
      if block_given?
        @target.send(method, *args)  { |*block_args| yield(*block_args) }
      else
        @target.send(method, *args)
      end
    else
      super
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这就是我要的:

Product.last.category.ex_undefined_method #=> true
Run Code Online (Sandbox Code Playgroud)

我怎么能做到这一点?

ruby-on-rails associations method-missing belongs-to

2
推荐指数
1
解决办法
2398
查看次数

如何找到jar cointainign给定的类

缺少类"org.apache.xerces.impl.XMLDocumentFragmentScannerImpl"时出错.这是一个新的项目设置,whitout使用maven或其他工具来管理依赖项.我想忘了包含一些jar,如何找到自己的XMLDocumentFragmentScannerImpl?

java classpath method-missing

2
推荐指数
1
解决办法
1066
查看次数

为什么`method_missing`没有捕获一些未定义的方法(例如Foo)?

我尝试通过以下定义捕获未定义的方法:

def method_missing m
  puts "#{m} is missing"
end
Run Code Online (Sandbox Code Playgroud)

当我编写一个未定义的方法,例如foo在它之后,它被捕获method_missing:

foo # => foo is missing
Run Code Online (Sandbox Code Playgroud)

但是当我写一个未定义的方法,例如Foo,它没有被捕获method_missing:

Foo # => NameError: Uninitialized constant Foo
Run Code Online (Sandbox Code Playgroud)

看起来如果它是从常量消除歧义,那么它被捕获:

self.Foo # => Foo is missing
Foo() # => Foo is missing
Run Code Online (Sandbox Code Playgroud)

为什么Foo不在第一种情况下捕获?这是一个特征,当一个方法在局部变量之间不明确时,它会被捕获method_missing,但不是在常量之间不明确的时候?如果是这样,有关于此的文件吗?或者,这是一个错误吗?

ruby methods metaprogramming method-missing

2
推荐指数
1
解决办法
81
查看次数