1

Ruby 1.9.3:引数としてクラス、シンボル、およびprocを取り、そのクラスの新しいインスタンスメソッドを定義(最終的には上書き)するメソッドを実装しようとしていますが、このテストに合格するためにクラスメソッドは実装していません。

require 'test/unit'

include Test::Unit::Assertions

class String
  def my_method
    'my_method'
  end
end

def define_instance_method(klass, method, &block)
  # klass.send :define_method, method, &block
  # ...
end

define_instance_method(Object, :my_method) { 'define_instance_method my_method' }
define_instance_method(String, :my_method) { 'define_instance_method my_method' }

assert Object.new.my_method == 'define_instance_method my_method'
assert_raise(NoMethodError) { Object.my_method }

assert String.new.my_method == 'define_instance_method my_method'
assert_raise(NoMethodError) { String.my_method }

私は多くの試み(、、、、、、... )を行いましたがdefine_method、成功しませんでした。あなたはなにか考えはありますか?define_singleton_methodclass_evalinstance_evalinstance_execmodule_eval

4

2 に答える 2

3

@ProGNOMmers、Rubyのオブジェクトはクラスであり、クラスはオブジェクトであることを思い出してください。

したがって、Rubyのすべてはオブジェクトであり、クラスも含まれます:)

また、内部でメソッドを定義すると、から継承するすべてのクラスだけでなく、そのメソッドObjectも使用できるようになります。ClassObject

それはすべてのクラスにとって意味があります。

いくつかの証拠:

define_instance_method(String, :my_method) { 'define_instance_method my_method' }

p String.new.my_method
p String.my_method

# =>  "define_instance_method my_method"
# =>  stackoverflow.rb:11:in `<main>': undefined method `my_method' for String:Class (NoMethodError)

を参照してください。メソッドは内部でまだ定義されていないため、内部Objectでは使用できませんString

それではやってみましょう:

define_instance_method(Object, :my_method) { 'define_instance_method my_method' }

p String.my_method
# => "define_instance_method my_method"

p Array.my_method
# => "define_instance_method my_method"

p NilClass.my_method
# => "define_instance_method my_method"

したがってdefine_instance_method(Object...、テストにコメントするだけで
String仕様は問題なく合格します。

ここにいくつかの衝突試験があります

于 2012-12-01T23:39:48.100 に答える
0

class_evalが機能するはずです。なぜうまくいかないのか教えてください

class A
end

A.class_eval do
  define_method(:foo) {puts 'hello'}
end

A.new.foo #hello
A.foo     #NoMethodError: undefined method `foo' for A:Class
于 2012-12-01T23:51:52.927 に答える