elixir模擬ruby快速複製字串

StraightDave發表於2014-10-21

Ruby中用乘號可以快速的複製字串,如

irb> "*" * 5    # => "*****"

作為語法向ruby看齊的elixir,怎麼說也得有這個才行啊。elixir的Kernel模組中只是中規中矩的實現了普通數字乘法(用的是Erlang的方法),自己動手便是極好的。

直接上程式碼:

defmodule MyOp do
  @moduledoc """
  Override the multiply operator
  """

  defmacro __using__(_) do     #近期還會推出關於Elixir超程式設計的內容。到時候會詳細講解巨集的知識
    quote do
      import MyOp
      import Kernel, except: [*: 2]
    end
  end

  defmacro lv * rv when is_bitstring(lv) and is_integer(rv) and rv > 0 do
    list = append(lv,[],rv)
    quote do
      unquote(list)
    end
  end

  defmacro lv * rv do
    quote do
      unquote(lv) * unquote(rv)
    end
  end

  defp append(char, list, n) when n == 1 do
    [char|list] |> IO.chardata_to_string
  end

  defp append(char, list, n) when n > 1 do
    append(char, [char|list], n-1)
  end
end

這段簡單的程式碼實現了為原有乘法符號新加功能的目的,包含了幾個知識點:

  • 巨集與超程式設計
  • import和unimport(覆蓋Kernel中的實現)
  • using巨集
  • 函式遞迴實現的迴圈
  • 字串和列表
  • 私有函式
  • 衛兵語句
    等等。

可以參考《Elixir中文入門教程》相關章節以及官網上的文章學習。

它的用法就很類似ruby了:

iex> use MyOp
iex> IO.puts "*" * 5
"*****"
:ok

相關文章