这儿有个问题。当你写”1+2”时,Ruby知道在对象1(a Fixnum)上调用+号,将Fixnum2做为参数传递给它。但是,当你写”1+2.3”时,同样的+方法立刻接受一个Float参数。它是如何知道做什么的呢(用”接口类型”精神来直接地检查你的参数的类)?
答案是Ruby基于方法coerce的强制协议。coerce的基本操作很简单。它接受两个数字(一个做为它的被调,另一个做为参数)。它返回包含表示这两个数字的一个两元素的数组(但是跟在第一个参数后面的才是被调)。coerce方法保证这两个对象有同样的类,所以它们可以被添加(或乘,或比较,或其它什么)。
1.coerce(2) => [2, 1]
1.coerce(2.3) => [2.3, 1.0]
(4.5).coerce(2.3) => [2.3, 4.5]
(4.5).coerce(2) =>[2.0, 4.5]
秘密是被调调用它的参数的coerce方法来产生这个数组。这个技术,被称为双重分派(double dispatch),它允许一个方法不仅可在它自己的类上修改它的行为,也可以在它的参数的类上修改它的行为。这种情况下,我们使用参数来正确地决定,应该被加(或乘,除等等)的对象的类是什么。
让我们写个新类,它的目的获得算法部分。要想用上强制,我们需要实现一个coerce方法。它接受一些其它种类数字
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |