Scala、PHP、Rubyのfor文を一行で書く方法
-
カテゴリ:
- Scala
業務でSparkを使う必要があり、Scalaでプログラミングをするため少し勉強した内容をメモします。
個人的なScalaの印象としては、初見でソースが読むのは少し難しい印象があります。
アロー関数や処理を1行で書く方法が多くあり、文字数をいかに少なく書くかというScalaの思想に少し慣れるのに時間ががかりました。
今回は読みづらいと思った中でも特に印象深いfor文のサンプルを記事に残しておこうと思います。加えて、比較対象として同じような処理でPHPとRubyでもご紹介します。
Scalaはジェネレータ(処理の塊?)が複数あった場合は、左から順に展開されていくことがポイントです。
[Scala]
//原文(1行で書く例)
for(i <- 1 to 5; j <- Seq("A", "B")) println(i+"-"+j)
//展開(1回目)
(1 to 5).foreach(
i => for(j <- Seq("A", "B")) println(i+"-"+j)
)
// 最終的に展開され処理されるコード
(1 to 5).foreach(
i => Seq("A", "B").foreach(
j => println(i+"-"+j)
)
)
/*
[出力結果]
1-A
1-B
2-A
2-B
3-A
3-B
4-A
4-B
5-A
5-B
*/
[PHP]
// 1行で書く例
foreach(range(1,5) as $i) foreach(range("A","B") as $j) echo "$i-$j<br>";
// 展開
$a = array(1,2,3,4,5);
$b = array("a","b");
foreach($a as $i) {
foreach($b as $j) {
echo ("{$i}-{$j}");
}
}
/* 出力結果はScalaと同様*/
[Ruby]
# 1行で書く例
(1..5).each{|i| ['A','B'].each{|j| puts "#{i}-#{j}" } }
# 展開
for i in (1..5)
for j in ["A","B"]
puts "#{i}-#{j}"
end
end
/* 出力結果はScalaと同様*/
投稿日:2018-10-03
更新日:2019-02-26