Skip to content
Permalink
Browse files

Elixir 0.4.0dev ベースのコードに書き換え

  • Loading branch information
migrs committed Mar 13, 2012
1 parent 3fd5b7a commit 0747d7c8cf7cbf867d1654e42f6c6a1bd2963084
Showing with 26 additions and 26 deletions.
  1. +26 −26 source/_posts/2012-03-12-why-rubyists-should-try-elixir.markdown
@@ -49,26 +49,26 @@ Elixir が持つ Ruby から来た *method missing* や *module eval* のよう

``` elixir
[first, second] = [1,2]
first % => 1
second % => 2
first # => 1
second # => 2
```

Ruby の代入演算子を使用して全く同じように書くことができるが、パターンマッチングの利点はメソッドのシグネチャの中で利用できることで、もしメソッドのシグネチャがある特定のパターンに一致しない場合は次のメソッドが試される。

例えば、文字列のリストを反復処理しそれらを出力する方法は次のとおりだ:

``` elixir
module Printer
% これは少なくとも一つの要素が存在するリストにマッチするパターンだ
% 最初の要素が head に割り当てられ、残りは tail に割り当てられる
def print([head|tail])
defmodule Printer do
# これは少なくとも一つの要素が存在するリストにマッチするパターンだ
# 最初の要素が head に割り当てられ、残りは tail に割り当てられる
def print([head|tail]) do
IO.puts head
print(tail) % 再帰的に tail と引数として print が呼び出される
print(tail) # 再帰的に tail と引数として print が呼び出される
end
% リストが空になったとき上のメソッドではマッチぜず、かわりにこれがマッチする
def print([])
% 何もしない。すべての出力は完了している。
# リストが空になったとき上のメソッドではマッチぜず、かわりにこれがマッチする
def print([]) do
# 何もしない。すべての出力は完了している。
end
end
@@ -78,29 +78,29 @@ Printer.print ["foo", "bar", "baz"]
また別のクールな例はリストが別のリストの接頭辞であるかどうかを確認する再帰的なメソッドだ:

``` elixir
module Prefix
% 両方のリストを反復する。もし最初の要素が等しかったら自分自身を再び呼び出す。
% もし最初の要素(i)が等しくなかったら、このメソッドにはマッチしない。
def is?([i|prefix], [i|list]) is?(prefix, list); end
defmodule Prefix do
# 両方のリストを反復する。もし最初の要素が等しかったら自分自身を再び呼び出す。
# もし最初の要素(i)が等しくなかったら、このメソッドにはマッチしない。
def is?([i|prefix], [i|list]) do is?(prefix, list) end
% もし接頭辞が空だったらこのメソッドにマッチし true を返す。
def is?([], _list) true; end
# もし接頭辞が空だったらこのメソッドにマッチし true を返す。
def is?([], _list) do true end
% それ意外なら、false を返す。
def is?(_prefix, _list); false; end
# それ意外なら、false を返す。
def is?(_prefix, _list) do false end
end
Prefix.is?([1,2,3], [1,2,3,4,5]) % => true
Prefix.is?([0,1,2], [1,2,3,4,5]) % => false
Prefix.is?([1,2,3], [1,2,3,4,5]) # => true
Prefix.is?([0,1,2], [1,2,3,4,5]) # => false
```

最後に、パターンマッチングは Ruby 2.0 で計画されている機能の一つであるキーワード引数を可能にする。
この例は Elixir のコードそのものだ(Elixir のシンボルはコロンではなくシングルクォートでることに注意):
この例は Elixir のコードそのものだ<del>(Elixir のシンボルはコロンではなくシングルクォートでることに注意)</del>

``` elixir
module Record
def retrieve(name, 'from: file)
% ここに実装を書く ...
defmodule Record do
def retrieve(name, from: file) do
# ここに実装を書く ...
end
end
```
@@ -148,9 +148,9 @@ def create
post1 = post0.set(:published, false)
post2 = post1.save
if post2.persisted?
if post2.persisted? do
redirect_to post2
else
else:
render :new
end
end

0 comments on commit 0747d7c

Please sign in to comment.
You can’t perform that action at this time.