寻找等效于Ruby的Elixir:
"[email protected]".index("@") # => 9
"[email protected]".index("domain") # => 10
TL; DR:故意缺少String.index / 2,因为存在更聪明的替代方法。通常,String.split / 2可以解决潜在的问题-并具有更好的性能。
我假设我们在这里谈论的是UTF-8字符串,并希望能够完全处理非ASCII字符。
Elixir鼓励使用快速代码。事实证明,我们通常使用String.index / 2尝试解决的问题可以用一种更聪明的方式解决,从而在不降低代码可读性的情况下极大地提高了性能。
更聪明的解决方案是使用String.split / 2和/或其他类似的String模块功能。String.split / 2在字节级别上运行,同时仍可以正确处理字素。不会出错,因为两个参数都是字符串!String.index / 2必须在字素级别上工作,并缓慢地遍历整个String。
因此,除非有非常引人注目的用例无法用现有函数彻底解决,否则不太可能将String.index / 2添加到语言中。
另请参阅关于此问题的elixir-lang-core讨论:https : //groups.google.com/forum/#!topic/ elixir-lang-core/ S0yrDxlJCss
附带说明一下,Elixir在成熟的Unicode支持方面非常独特。虽然大多数语言都在代码点级别上工作(俗称“字符”),但Elixir却使用了更高的字素概念。字素是用户认为的一个字符(更确切地说,它是对“字符”的理解)。字素可以包含一个以上的代码点(而代码点又可以包含一个以上的字节)。
最后,如果我们确实需要索引:
case String.split("[email protected]", "domain", parts: 2) do
[left, _] -> String.length(left)
[_] -> nil
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句