ErlPort vous permet de travailler avec le code Python et Ruby d'Elixir.
Cependant, il n'y avait aucune description de la classe dans Documentation, donc je l'ai essayé.
Dès la conclusion, c'est un peu contre-intuitif.
$ mix new python
python/mix.exs
defmodule Python.Mixfile do
# ...
defp deps do
[
{:erlport, github: "hdima/erlport"}
]
end
end
python/sample.py
class Sample(object):
def __init__(self):
print("Sample.__init__")
self.message = "Hello, world!"
def print_message(self):
print(self.message)
def set_message(self, msg):
self.message = msg
Démarrez le processus python avec : python.start ()
et appelez la fonction avec : python.call ()
.
$ iex -S mix
iex(7)> {:ok, python} = :python.start([python_path: '.'])
iex(8)> obj = python |> :python.call(:sample, :Sample, [])
Sample.__init__
iex(9)> python |> :python.call(:sample, :"Sample.print_message", [obj])
Hello, world!
Il n'y a pas de problème pour l'instant. Ensuite, essayez d'appeler Sample.set_message ()
.
iex(13)> python |> :python.call(:sample, :"Sample.set_message", [obj, "Hello, ErlPort!"])
iex(14)> python |> :python.call(:sample, :"Sample.print_message", [obj])
Hello, world!
cette? Le message n'a pas changé.
Si vous essayez de renvoyer self
avec` Sample.set_message () ʻet laissez l'appelant le recevoir,
python/sample.py
class Sample(object):
# ...
def set_message(self, msg):
self.message = msg
return self
iex(15)> {:ok, python} = :python.start([python_path: '.'])
iex(16)> obj = python |> :python.call(:sample, :Sample, [])
Sample.__init__
iex(18)> obj = python |> :python.call(:sample, :"Sample.set_message", [obj, "Hello, ErlPort!"])
iex(19)> python |> :python.call(:sample, :"Sample.print_message", [obj])
Hello, ErlPort!
:undefined
Cette fois, le message a changé. Il se comporte comme si «self» était un objet immuable.
Recommended Posts