Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 回应和回应有什么不同?_Ruby_Metaprogramming - Fatal编程技术网

Ruby 回应和回应有什么不同?

Ruby 回应和回应有什么不同?,ruby,metaprogramming,Ruby,Metaprogramming,我不知道什么时候使用这些方法。 从回复到?文档: 如果obj响应给定的方法,则返回true。私有方法 仅当可选的第二个参数 计算结果为true 如果未实现该方法,如Windows上的Process.fork, GNU/Linux上的File.lchmod等,返回false 如果未定义方法,是否对缺少的方法进行响应?方法被调用,并且 返回结果 和响应\u缺失?: Hook方法返回obj是否可以响应id方法或 不是 请参见“回复” 两种方法都有两个参数。 这两种方法似乎是一样的(检查某个对象是否响应

我不知道什么时候使用这些方法。 从
回复到?
文档:

如果obj响应给定的方法,则返回true。私有方法 仅当可选的第二个参数 计算结果为true

如果未实现该方法,如Windows上的Process.fork, GNU/Linux上的File.lchmod等,返回false

如果未定义方法,是否对缺少的方法进行响应?方法被调用,并且 返回结果

响应\u缺失?

Hook方法返回obj是否可以响应id方法或 不是

请参见“回复”

两种方法都有两个参数。
这两种方法似乎是一样的(检查某个对象是否响应给定的方法),那么为什么我们应该同时使用这两种方法呢

定义“resond_to_missing?”可以让您采取以下方法:

class A
  def method_missing name, *args, &block
    if name == :meth1
      puts 'YES!'
    else
      raise NoMethodError
    end
  end

  def respond_to_missing? name, flag = true
    if name == :meth1
      true
    else
      false
    end
  end
end

[65] pry(main)> A.new.method :meth1
# => #<Method: A#meth1>
将其委托给不同的对象:

class A
  def initialize name
    @str = String name
  end

  def method_missing name, *args, &block
    @str.send name, *args, &block
  end
end
二,。其他我不知道的方式

两者应该在哪里定义/使用(我也猜): 从1.9.3开始(我记得这很公平)只定义
respond\u to\u missing?
,但只使用
respond\u to?

最后问题:
我说得对吗?我错过什么了吗?纠正所有不好的地方和/或回答此问题中提出的问题。

回复缺失?
应该在您使用方法缺失技术提供其他方法时更新。这将使Ruby解释器更好地理解新方法的存在

事实上,如果不使用
respond\u to\u missing?
,就无法使用

关于
对缺少的内容作出响应?

为了回应你?要返回true,可以对其进行专门化,如下所示:

class StereoPlayer
  # def method_missing ...
  #   ...
  # end

  def respond_to?(method, *)
    method.to_s =~ /play_(\w+)/ || super
  end
end
p.respond_to? :play_some_Beethoven # => true
这是更好的,但它仍然不能使一些贝多芬的行为完全像一种方法。事实上:

p.method :play_some_Beethoven
# => NameError: undefined method `play_some_Beethoven'
#               for class `StereoPlayer'
Ruby 1.9.2引入了
response\u to\u missing?
,为问题提供了一个干净的解决方案。与其专门化
respond\u to?
不如专门化
respond\u to\u missing?
。下面是一个完整的示例:

class StereoPlayer
  # def method_missing ...
  #   ...
  # end

  def respond_to_missing?(method, *)
    method =~ /play_(\w+)/ || super
  end
end

p = StereoPlayer.new
p.play_some_Beethoven # => "Here's some_Beethoven"
p.respond_to? :play_some_Beethoven # => true
m = p.method(:play_some_Beethoven) # => #<Method: StereoPlayer#play_some_Beethoven>
# m acts like any other method:
m.call # => "Here's some_Beethoven"
m == p.method(:play_some_Beethoven) # => true
m.name # => :play_some_Beethoven
StereoPlayer.send :define_method, :ludwig, m
p.ludwig # => "Here's some_Beethoven"
class立体声播放器
#缺少def方法\u。。。
#   ...
#结束
def响应_至_缺失?(方法,*)
方法=~/play|(\w+)/| | super
结束
结束
p=立体声播放器。新
p、 演奏贝多芬“这是贝多芬”
p、 答复演奏一些贝多芬的作品,对吗
方法(演奏贝多芬)#
#m的行为与任何其他方法类似:
m、 打电话给#=>“这里有一些贝多芬”
方法(演奏一些贝多芬)正确
m、 名字:演奏贝多芬
StereoPlayer.send:define_方法,:ludwig,m
p、 路德维希:“这是一些贝多芬”
另请参见。

可能会有所帮助。
class StereoPlayer
  # def method_missing ...
  #   ...
  # end

  def respond_to_missing?(method, *)
    method =~ /play_(\w+)/ || super
  end
end

p = StereoPlayer.new
p.play_some_Beethoven # => "Here's some_Beethoven"
p.respond_to? :play_some_Beethoven # => true
m = p.method(:play_some_Beethoven) # => #<Method: StereoPlayer#play_some_Beethoven>
# m acts like any other method:
m.call # => "Here's some_Beethoven"
m == p.method(:play_some_Beethoven) # => true
m.name # => :play_some_Beethoven
StereoPlayer.send :define_method, :ludwig, m
p.ludwig # => "Here's some_Beethoven"