Elixir功能是否具有最大的灵活性?

时间:2019-05-08 17:32:19

标签: function elixir variadic-functions

函数可以接受的参数数量是否有上限?这不包括模式匹配。例如。定义为fn ([arg1, arg2, arg3], arg4)的函数仅计为2。

如果没有上限,Elixir是否也支持可变参数功能?

2 个答案:

答案 0 :(得分:8)

Elixir在Erlang的顶部运行,其最大Arity似乎为 255 参见本页:http://erlang.org/doc/reference_manual/typespec.html 并搜索到包含该行的表:     arity() 0..255

确认性更新: 尝试编译具有255个参数的函数是可行的。

尝试使用256个参数编译函数会产生以下编译错误:

== Compilation error in file arity.ex ==
** (CompileError) arity.ex:3: too many arguments (256) - maximum allowed is 255
    (stdlib) lists.erl:1338: :lists.foreach/2
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
** (CompileError)  compile error
    (iex) lib/iex/helpers.ex:183: IEx.Helpers.c/2

使用c "arity.ex"在Windows 10 x64上的Elixir Shell中完成测试,其中arity.ex的内容(加或减参数)为:

defmodule Test do
 def arity(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28, p29, p30, p31, p32, p33, p34, p35, p36, p37, p38, p39, p40, p41, p42, p43, p44, p45, p46, p47, p48, p49, p50, p51, p52, p53, p54, p55, p56, p57, p58, p59, p60, p61, p62, p63, p64, p65, p66, p67, p68, p69, p70, p71, p72, p73, p74, p75, p76, p77, p78, p79, p80, p81, p82, p83, p84, p85, p86, p87, p88, p89, p90, p91, p92, p93, p94, p95, p96, p97, p98, p99, p100, p101, p102, p103, p104, p105, p106, p107, p108, p109, p110, p111, p112, p113, p114, p115, p116, p117, p118, p119, p120, p121, p122, p123, p124, p125, p126, p127, p128, p129, p130, p131, p132, p133, p134, p135, p136, p137, p138, p139, p140, p141, p142, p143, p144, p145, p146, p147, p148, p149, p150, p151, p152, p153, p154, p155, p156, p157, p158, p159, p160, p161, p162, p163, p164, p165, p166, p167, p168, p169, p170, p171, p172, p173, p174, p175, p176, p177, p178, p179, p180, p181, p182, p183, p184, p185, p186, p187, p188, p189, p190, p191, p192, p193, p194, p195, p196, p197, p198, p199, p200, p201, p202, p203, p204, p205, p206, p207, p208, p209, p210, p211, p212, p213, p214, p215, p216, p217, p218, p219, p220, p221, p222, p223, p224, p225, p226, p227, p228, p229, p230, p231, p232, p233, p234, p235, p236, p237, p238, p239, p240, p241, p242, p243, p244, p245, p246, p247, p248, p249, p250, p251, p252, p253, p254, p255, p256 ) do 
  IO.puts( "hello world" )
 end
end

答案 1 :(得分:0)

  

如果没有上限,Elixir是否也支持可变参数功能?

Beam不支持可变参数功能。这实际上是从Prolog继承的。

Elixir通过创建第二个函数来伪造它,该函数调用第一个函数,因此以本示例为例。如果查看编译后的代码,您会发现有两个函数count/1count/2

def count(start , end \\ 10), do: ... 

如果要对其进行反编译,则会发现类似这样的代码

def count(start), do: count(start, 10)
def count(start, end), do: ...