mattn / anko

Scriptable interpreter written in golang
http://play-anko.appspot.com/
MIT License
1.45k stars 120 forks source link

Methods definition #351

Open c4s4 opened 2 years ago

c4s4 commented 2 years ago

In Go, a method defined on a pointer like this:

func (u *User) SayHello() {...}

May be called on a pointer or on an instance:

user1 := &User{Name: "Michel"}
user1.SayHello()
user2 := User{Name: "Michel"}
user2.SayHello()

But this is not the case in Anko, as following example demonstrates:

package main

import (
    "fmt"
    "log"

    "github.com/mattn/anko/env"
    "github.com/mattn/anko/vm"
)

type User struct {
    Name string
}

func (u *User) SayHello() {
    fmt.Printf("Hello %s!\n", u.Name)
}

func main() {
    e := env.NewEnv()
    user := User{Name: "Michel"}
    user.SayHello()
    err := e.Define("user", user)
    if err != nil {
        log.Fatalf("Define error: %v\n", err)
    }
    _, err = vm.Execute(e, nil, "user.SayHello()")
    if err != nil {
        log.Fatalf("Execute error: %v\n", err)
    }
}

Which prints:

$ go run main.go 
Hello Michel!
2022/01/12 18:42:13 Execute error: no member named 'SayHello' for struct
exit status 1