GO语言中的interface在ruby里面是个什么概念

最近有稍微关注一下GO语言,在看到interface这块的时候有点小晕

package main

import (
    "fmt"
    "math"
)

type Abser interface {
    Abs() float64
}

func main() {
    var a Abser
    f := MyFloat(-math.Sqrt2)
    v := Vertex{3, 4}

    a = f  // a MyFloat 实现了 Abser
    a = &v // a *Vertex 实现了 Abser

    fmt.Println(a.Abs())
}

type MyFloat float64

func (f MyFloat) Abs() float64 {
    if f < 0 {
        return float64(-f)
    }
    return float64(f)
}

type Vertex struct {
    X, Y float64
}

func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

后面去论坛问了一些大神,说你只要知道ruby里面的duck type,就能搞懂这是怎么回事,于是我去回顾了一下ruby里duck type(多态)的定义

一个对象只要它像鸭子一样走路,像鸭子一样嘎嘎叫,那么解释器会很高兴的把它当做鸭子来对待的

什么意思?

class A
  def hello
     'it works'
  end
end

class B
  def  hello
    'it works2'
  end
end

[A, B].each do |klass|
  ins = klass.new
  ins.hello
end

举个再常用一点的例子,一个数组里面有一个整数型,一个浮点数型,你对他们分别进行to_s, 都可以实现变成字符串

不得不感叹ruby语法的强大,对比其他语言的实现(c++中的纯虚函数,go里面的interface),ruby多态的实现是如此优雅!

我们接下来还是回到这段go语法中来解释一下interface的概念

Interface定义了一个或一组method(s),这些method(s)只有函数签名,没有具体的实现代码。若某个数据类型实现了Interface中定义的那些被称为"methods"的函数,则称这些数据类型实现(implement)了interface

代码中一开始定义了一个interface, 里面只有一个函数签名,并不需要实现这个函数

MyFloat和Vertex你可以理解为2个类(GO里面没有类,但是可以定义struct),这两个类都包含了Abs()方法,因此这两个类的对象(姑且称之为对象吧),都达到了Abser()这个接口的条件,实现了多态, 至于多态带来来的好处,这次就先不说了。

你可能感兴趣的:(GO语言中的interface在ruby里面是个什么概念)