Scala、PHP、Rubyのfor文を一行で書く方法

業務で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

[スポンサーリンク]

  
サイト内検索
プロフィール

プロフィール

[Name : じゃぶじゃぶ(@jbjb_2019)]
都内で社内SEをしているおじさん。
仕事で得られる知識だけでは限界を感じ、 WEBの勉強がてらITブログを開始。
サーバからWEBサイトまでフルスクラッチで開発しました。
現在は勉強のモチベーションを保つために活用中。
興味があることを雑記的に書いていきます。

[スポンサーリンク]

[スポンサードリンク]