是否有类似Python的str.isidentifier
:
>>> "foo".isidentifier()
True
>>> "42".isidentifier()
False
答案 0 :(得分:4)
在Erlang中,原子用于表示常量值。
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V7.0 (abort with ^G)
1> is_atom(sunday).
true
2> is_atom('sunday').
true
3> is_atom("sunday").
false
4>
而且,erlang中没有string
类型。 string
只是一个整数列表。
8> B = [115,117,110,100,97,121].
"sunday"
9> is_list(B).
true
10>
答案 1 :(得分:4)
任何atom都是有效的"标识符",因为它可以是Erlang和Elixir中函数的名称。但是,由于某些原子需要引用,您可能需要一些技巧来实际定义这样的函数。
在Erlang中,引用the reference manual:
如果原子不是以小写字母开头,或者包含除字母数字字符,下划线(_)或@之外的其他字符,则用单引号(')括起来。
我找不到Elixir的类似描述,但我认为它类似。
This blog post解决了如何创建此类函数的问题。简而言之,在Erlang中,您只需将函数名称放在单引号中,然后就完成了:
-module(fortytwo).
-export(['42'/1]).
'42'(X) ->
{ok, X}.
可以从shell中调用此函数:
> fortytwo:'42'(a).
{ok,a}
在Elixir中,您需要使用unquote
宏来定义函数:
defmodule Fortytwo do
def unquote(:"42")(x) do
{:ok, x}
end
end
并且无法在正常函数调用中引用函数名称,因此您需要使用apply
:
> apply(Fortytwo, :"42", [:a])
{:ok, :a}