削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎サンプルコード・ギャラリー: 実際にCrystalで書かれたのコードを見てみましょう→‎エラトステネスの篩: エラトステネスの篩を、若干 Crystal らしく書いてみました。
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎eachメソッドが値を返さない: Rubyでは、Arrayなどのeachメソッドは self を返し、break で中断すると nil を返します。これに対し Crystal では、Arrayなどのeachメソッドは self を返さない(常に nil を返す)ので上記のようなトリッキーなコードはかけずフラッグを使います。
タグ: 2017年版ソースエディター
282 行
これはリーズナブルな選択ではありません。
Crystal では、eval() が必要なケースに(限定的ですが)マクロを使うことで実現出来る可能性があります。
 
=== eachメソッドが値を返さない ===
Rubyでは、Arrayなどのeachメソッドは self を返し、break で中断すると nil を返します。
 
そこで、このようなコードがかけます。
:;[https://paiza.io/projects/Je9yc_1sAi0h-jMfCSln4g?language=ruby 100以下の素数を求めるコード(Ruby)]:<syntaxhighlight lang="ruby" highlight="3,4" line>
primes = []
(2..100).each do |i|
primes.push(i) if primes.each do |prime|
break if i % prime == 0
end
end
p primes
</syntaxhighlight>
::実行結果:<syntaxhighlight lang="text">
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
</syntaxhighlight>
:: 素数集合(primes)から1つ素数(prime)を取出し、候補(i)をそれで割り、割切れたら break します。
:: <u>break すると each は nil を返し、素数集合への候補の追加は行われません。</u>
 
これに対し Crystal では、Arrayなどのeachメソッドは self を返さない(常に nil を返す)ので上記のようなトリッキーなコードはかけずフラッグを使います。
:;100以下の素数を求めるコード(Crystal):<syntaxhighlight lang="ruby" highlight="3,6,10" line>
primes = [] of Int64
(2..100).each do |i|
flag = true
primes.each do |prime|
if i % prime == 0
flag = false
break
end
end
primes.push(i) if flag
end
p primes
</syntaxhighlight>
 
=== マクロ ===