Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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 on rails 为什么‘可复制?’是这样定义的?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 为什么‘可复制?’是这样定义的?

Ruby on rails 为什么‘可复制?’是这样定义的?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我在Rails源代码中遇到了这一点: class Object def duplicable? true end end class NilClass begin nil.dup rescue TypeError def duplicable? false end end end 使用此代码,即使从对象中删除了dup,该对象也会以true响应duplicable? 我认为可以将其改写为更简单的代码,如: class Ob

我在Rails源代码中遇到了这一点:

class Object
  def duplicable?
    true
  end
end

class NilClass
  begin
    nil.dup
  rescue TypeError    
    def duplicable?
      false
    end
  end
end
使用此代码,即使从对象中删除了
dup
,该对象也会以
true
响应
duplicable?

我认为可以将其改写为更简单的代码,如:

class Object
  def duplicable?
    repond_to?(:dup)
  end
end

使用
begin
rescue
nil
响应
dup
显式抛出
类型错误(这反过来与
NoMethodError
无关)定义
可复制性有什么好处[更正:在2.4之前已对dup作出响应,学分归@Stefan。]

NilClass.instance_method(:dup)
#⇒ #<UnboundMethod: NilClass(Kernel)#dup>
NilClass.instance\u方法(:dup)
#⇒ #
目标是用
false
响应
duplicable?
,除非
NilClass#dup
被城市中的另一个猴子补丁覆盖。[更正:将“另一个猴子补丁”读作“Matz”:]

使用
begin
rescue
定义
可复制?
的优点是什么

Ruby 2.4之前的版本在尝试
nil.dup
时引发类型错误:

$rbenv本地2.3.0
$ruby——版本
ruby 2.3.0p0(2015-12-25修订版53290)[x86_64-darwin15]
$ruby-e'p nil.dup'
-e:1:在'dup'中:无法复制NilClass(TypeError)
from-e:1:in`'
从Ruby 2.4开始,
nil.dup
只返回自身:

$rbenv本地2.4.0
$ruby——版本
ruby 2.4.0p0(2016-12-24修订版57164)[x86_64-darwin15]
$ruby-e'p nil.dup'
无
将方法定义放在
rescue
中可确保该方法仅为引发
TypeError
的Ruby版本定义

我认为可以将其改写为更简单的代码,如:[……]

简单地检查接收器是否响应
dup
不起作用,因为
nil
——作为
对象
——即使在2.3中也会响应
dup
类型错误
是从
对象#dup
内部产生的:

值rb\u obj\u dup(值obj)
{
值dup;
if(rb_特殊_const_p(obj)){
rb_raise(rb_eTypeError,“无法复制%s”,rb_obj_classname(obj));
}
// ...
}

@engineerk这一个肯定应该被标记为正确答案,而不是我的。请修改。我可能在复选标记和回答中犯了一些错误。很抱歉在stackoverflow中成为乞丐。@engineerk无忧:-)@Stefan我没有足够的代表来修改外国复选标记:(