Ruby on rails 为什么‘可复制?’是这样定义的?
我在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
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我没有足够的代表来修改外国复选标记:(