什么';Elixir中的用法与Ruby中的实例变量类似吗?

什么';Elixir中的用法与Ruby中的实例变量类似吗?,elixir,Elixir,我目前正努力满足这一要求。例如,我有一个函数列表 def function_a(a, b, c, d) do ... function_b(a, b) ... end defp function_b(a, b) do ... function_c(a, b) ... end defp function_c(a, b) do ... function_d(a, b) ... end defp function_d(a, b) do IO.inspect

我目前正努力满足这一要求。例如,我有一个函数列表

def function_a(a, b, c, d) do
  ...
  function_b(a, b)
  ...
end

defp function_b(a, b) do
  ...
  function_c(a, b)
  ...
end

defp function_c(a, b) do
  ...
  function_d(a, b)
  ...
end

defp function_d(a, b) do
  IO.inspect a
  IO.inspect b
end
现在我想在
函数中添加
IO.inspect d
。我能想到的唯一方法是将d作为每个函数的参数传递。这意味着我需要修改
函数b
函数c
函数d
(在现实世界中,这更重要)

在OOP世界中,我们可以将
d
存储为实例变量,此类中的任何函数都可以直接使用它

我问这个问题的原因是,我想避免增加参数的数量


《长生不老药》或《凤凰城》有什么好办法吗?

萨比瓦拉在评论中的建议很好。如果遵循将结构作为第一个参数传递给函数并从每个函数返回结构的约定,则可以非常轻松地编写管道链

defmodule示例do
defstruct~w(a b c d)a
def函数_a(%Example{}=Example)do
IO.inspect(示例a,标签:“a”)
例子
结束
定义函数_b(%Example{}=Example)do
IO.inspect(示例b,标签:“b”)
例子
结束
def函数_c(%Example{}=Example)do
IO.inspect(示例c,标签:“c”)
例子
结束
def函数_d(%Example{}=Example)do
IO.inspect(示例d,标签:“d”)
例子
结束
def call_all()do
%例{a:“我是a”,b:“这是b”,c:“c也是”,d:“最后是d”}
|>函数_a()
|>函数_b()
|>函数_c()
|>函数d()
结束
结束
在iex中运行:

iex(1)>Example.call\u all
a:“我是一个”
b:“这是b”
c:“我也是”
d:“最后是d”
%例{a:“我是a”,b:“这是b”,c:“c也是”,d:“最后是d”}
我不想用这种方式,因为它破坏了代码的某些含义


Elixir模块没有仅状态的函数和参数。无法从一个函数访问另一个函数中的参数。如果要避免使用新参数,则需要使用两个函数都知道的数据结构,或者将状态存储在某个位置(在流程、ETS、流程字典中…)。

Sabiwara在注释中的建议是好的。如果遵循将结构作为第一个参数传递给函数并从每个函数返回结构的约定,则可以非常轻松地编写管道链

defmodule示例do
defstruct~w(a b c d)a
def函数_a(%Example{}=Example)do
IO.inspect(示例a,标签:“a”)
例子
结束
定义函数_b(%Example{}=Example)do
IO.inspect(示例b,标签:“b”)
例子
结束
def函数_c(%Example{}=Example)do
IO.inspect(示例c,标签:“c”)
例子
结束
def函数_d(%Example{}=Example)do
IO.inspect(示例d,标签:“d”)
例子
结束
def call_all()do
%例{a:“我是a”,b:“这是b”,c:“c也是”,d:“最后是d”}
|>函数_a()
|>函数_b()
|>函数_c()
|>函数d()
结束
结束
在iex中运行:

iex(1)>Example.call\u all
a:“我是一个”
b:“这是b”
c:“我也是”
d:“最后是d”
%例{a:“我是a”,b:“这是b”,c:“c也是”,d:“最后是d”}
我不想用这种方式,因为它破坏了代码的某些含义


Elixir模块没有仅状态的函数和参数。无法从一个函数访问另一个函数中的参数。如果要避免使用新参数,则需要使用两个函数都知道的数据结构,或者将状态存储在某个位置(在流程、ETS、流程字典中……)。

是否尝试使用映射或自定义结构?e、 g.
def function_a(my_struct)do
将调用
function_b(my_struct)
,而
def function_d(my_struct)do
将只调用
IO.inspect(my_struct.d)
。请注意,结构与OOP类不同,但它们可能有助于以类似的方式定义数据的形状。Struct可以通过将数据分组到散列中来减少参数长度。i、 e.传递变量,如
选项
数据
。但这里我不想使用这种方式,因为它破坏了代码的某些含义。您是否尝试过使用映射或自定义结构?e、 g.
def function_a(my_struct)do
将调用
function_b(my_struct)
,而
def function_d(my_struct)do
将只调用
IO.inspect(my_struct.d)
。请注意,结构与OOP类不同,但它们可能有助于以类似的方式定义数据的形状。Struct可以通过将数据分组到散列中来减少参数长度。i、 e.传递变量,如
选项
数据
。但这里我不想用这种方式,因为它破坏了代码的某些含义。