是否有一个默认方法或类访问器,我可以添加到一个Ruby类,如果一个访问器(类似Ruby的属性)没有退出?然后,我可以编写一些自定义代码来回复,就像从数据库中读取的数组列表一样,可以像访问者一样访问值,而无需编写访问者代码(因为如果从数据库中读取它的未知数).
使用Ruby MRI 1.9
谢谢!
场景:
-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.发生了什么,是否有解决方法?我尝试a用begin/ 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) 我正在尝试实现一个用于将$转换为其他货币的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:我宁愿你不给我代码,而是解释,所以我可以自己确定它是如何完成的.
当我将类的实例上的方法委托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 ?
我想知道定义了哪个类method_missing.它在Object中定义.
如何确定层次结构中的哪个类覆盖它?
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编写代码)?
我来自Java和Ruby背景,我想知道在Erlang中是否有任何"method_missing"的等价物.我已经看过的文件,我可以看到的是使用erl_eval和erl_parse最接近的,但我想知道是否有任何其他方式?
我目前的代码:
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)
我怎么能做到这一点?
缺少类"org.apache.xerces.impl.XMLDocumentFragmentScannerImpl"时出错.这是一个新的项目设置,whitout使用maven或其他工具来管理依赖项.我想忘了包含一些jar,如何找到自己的XMLDocumentFragmentScannerImpl?
我尝试通过以下定义捕获未定义的方法:
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,但不是在常量之间不明确的时候?如果是这样,有关于此的文件吗?或者,这是一个错误吗?
method-missing ×10
ruby ×7
arity ×1
associations ×1
belongs-to ×1
class ×1
classpath ×1
delegation ×1
erlang ×1
instance ×1
irb ×1
java ×1
methods ×1