问题看起来像这样:
在类Range方法中编写todown的行为如下(使用block_given?和yield函数):
(3..5).todown {| i | 打印“ hi#{i}”}#打印hi5 hi4 hi3
(2 ... 7).todown #prints 65432
经过至少一个小时的谷歌搜索后,我仍然无法解决此问题。我已经做到了这一点:
class Range
def todown
to_a.reverse.each do |i|
yield(i)
end
end
end
我不知道在哪里添加(2..7).todown
行以获得所需的结果。
编辑:
我意识到这个问题只是一种练习,但是在修改Ruby的核心类时应该非常小心。这是讨论“金钱修补”风险的许多文章之一,以及在核心类补丁爆炸时可以采取的使风险最小化或使调试更容易的步骤。
现在,我们有一个(颇有争议的)替代方法,称为“精炼”。改进是v2.0的实验性补充。然后在v2.1中对其进行了修改并将其永久化。这是它在这里的工作方式。
首先,我们refine
在模块中创建一个类:
module M
refine Range do
def todown
reverse_each do |i|
case block_given?
when true then yield(i)
else print i
end
end
puts
end
end
end
让我们尝试一下:
(2...7).todown
#-> NoMethodError: undefined method `todown' for 2...7:Range
哎呀!我们已经创建了优化功能,但尚未激活它。为此,我们使用关键字using
:
using M
(2...7).todown
#-> 65432
(3..5).todown { |i| print "hi#{i} " }
#-> hi5 hi4 hi3
我在优化中添加了一个方法,但是您可以添加,修改,重命名或删除现有的实例或类方法,添加常量,等等。
最后一件事:细化在IRB中似乎不起作用。:浪潮]
您可以这样做:
class Range
def todown
f,l = first,last
l -= 1 if exclude_end?
if block_given?
while l >= f
yield(l)
l -= 1
end
else
s = ''
while l >= f
s << l.to_s
l -= 1
end
puts(s)
end
end
end
(2...7).todown
#-> 65432
(3..5).todown { |i| print "hi#{i} " }
#-> hi5 hi4 hi3
尽管有些长,但是您会看到Ruby的大多数内置方法(用Ruby而不是C编写)都是以类似的方式构造的,以尽可能减少对其他类中方法的依赖。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句