原来Ruby也支持Go语言式的Structural Typing接口

老蔡感觉,Go语言的接口不同于C++/Java中的接口,更加灵活、解耦。

在C++编程中,一般用抽象类来定义接口,而接口的实现是依赖于接口的,这样如果要新增功能的话,需要写派生类或者从基础类开始改动这个类,Python也是这样,导致有些时候,一些特定的场景想给一个已有类增加方法是比较麻烦的。

Go语言中,接口是依赖于实现的,也就是说,可以在做了一个模型后,再来发现:原来这个模型还能这么用!

援引一段老赵的解释:Go语言式的接口,就是不用显示声明类型T实现了接口I,只要类型T的公开方法完全满足接口I的要求,就可以把类型T的对象用在需要接口I的地方。这种做法的学名叫做Structural Typing,有人也把它看作是一种静态的Duck Typing。

老蔡认为,这种接口形式的精髓在于接口能后期加进来,一个模型可以对应多种使用方式。老蔡觉得,这种方式的接口,更加能抽象出模型。

今天老蔡发现,原来Ruby是支持这种接口的。

class String
def shuffle
self.split(‘’).shuffle.join
end
end
puts “www.oldcai.com".shuffle

上面这段代码,可以将”www.oldcai.com"这段字符串打乱成比如:"mad.wic.olwcwo"。

字符串这样的基础类本身是不支持这样的一些特殊要求的方法的,而如果不给字符串类型String加一个shuffle方法,就需要定义一个比如string_shuffle的函数来实现相同的功能,示例代码如下:

def string_shuffle(s)
s.split(‘’).shuffle.join
end
puts string_shuffle(“www.oldcai.com")

函数方法的实现,从代码总量上来看,是比定义成方法的要少,但是单看调用部分的代码,是要比方法要多的。而且就老蔡个人的眼光来看,定义成方法更美观,看起来更像面向对象(此眼光很土)。