1.はじめに
色々なプログラミング言語を使う機会が増えてきて、同じことを他の言語で実装するときに、「どうだったかな?」と調べる機会が増えてきました。
そうする中で、プログラム言語ごとの”文化”とも言える構文の違いを比べると、非常に興味深い知見が得られます。 今回は、主要な言語における、配列展開をするFor Each構文の書き方をまとめてみました。
- 1.はじめに
- 2.List型(配列) の For each
- 3.Dictionary型(ハッシュ、マップ) の For each
- (Appendix.1)オンラインコンパイラ
- (Appendix.2)参考資料
2.List型(配列) の For each
strings
変数に、3つの文字列要素を追加して、内容を表示します。
実行例
> A > B > C
C Sharp
using System; using System.Collections.Generic; public class Sample { public static void Main(string[] args) { var strings = new List<string>(); strings.Add("A"); strings.Add("B"); strings.Add("C"); foreach (var item in strings) Console.WriteLine($" > {item}\n"); } }
Elixir
strings = [] strings = strings ++ ["A"] strings = strings ++ ["B"] strings = strings ++ ["C"] Enum.each(strings, fn(item) -> IO.puts("> #{item}") end)
あるいは
add = &(&1 ++ [&2]) [] |> add.("A") |> add.("B") |> add.("C") |> Enum.each(fn(item) -> IO.puts("> #{item}") end)
Go
package main import "fmt" func main() { strings := []string{} strings = append(strings, "A") strings = append(strings, "B") strings = append(strings, "C") for _ ,v := range strings { fmt.Println("> ", v) } }
Python
def main(): # 型を宣言しておく場合 # from typing import List # dict: List[str] strings = [] strings.append("A") strings.append("B") strings.append("C") for item in strings: print(f' > {item}') if __name__ == "__main__": main()
Rust
fn main() { let mut strings = Vec::new(); strings.push("A"); strings.push("B"); strings.push("C"); for item in &strings { println!("> {}", item); } }
Xojo (REALbasic)
Dim Strings() As String Strings.Append("A") Strings.Append("B") Strings.Append("C") For Each item As String In Strings stdout.WriteLine(" > " + item) Next
3.Dictionary型(ハッシュ、マップ) の For each
dict
変数に、3つの(Key=文字列・Value=数値)要素を追加して、内容を表示します。
実行例
> A / 10 > B / 20 > C / 30
C Sharp
using System; using System.Collections.Generic; public class HelloWorld { public static void Main(string[] args) { var dict = new Dictionary<string, int>(); dict.Add("A", 10); dict.Add("B", 20); dict.Add("C", 30); foreach (var item in dict){ Console.WriteLine($" > {item.Key} / {item.Value}\n"); } } }
Elixir
dict = %{} dict = Map.put(dict, "A", 10) dict = Map.put(dict, "B", 20) dict = Map.put(dict, "C", 30) Enum.each(dict, fn({k,v}) -> IO.puts("> #{k} / #{to_string(v)}") end)
あるいは
%{} |> Map.put("A", 10) |> Map.put("B", 20) |> Map.put("C", 30) |> Enum.each( fn({k,v}) -> IO.puts("> #{k} / #{to_string(v)}") end)
Go
package main import "fmt" func main() { dict := map[string]int{} dict["A"] = 10 dict["B"] = 20 dict["C"] = 30 for k, v := range dict { fmt.Println(" > ", k, " / ", v) } }
Rust
use std::collections::HashMap; fn main() { let mut dict = HashMap::new(); dict.insert("A", 10); dict.insert("B", 20); dict.insert("C", 30); for (contact, &number) in dict.iter() { println!("> {} / {}", contact, number); } }
Python
def main(): # 型を宣言しておく場合 # from typing import Dict # dict: Dict[str, int] dict = {} dict['A'] = 10 dict['B'] = 20 dict['C'] = 30 for k, v in dict.items(): print(f'> {k} / {v}') if __name__ == "__main__": main()
Xojo
Dim dict As Xojo.Core.Dictionary = New Xojo.Core.Dictionary dict.Value("A") = 10 dict.Value("B") = 20 dict.Value("C") = 30 For Each item As Xojo.Core.DictionaryEntry In dict stdout.WriteLine("> " + item.Key + " / " + item.Value) Next
(Appendix)Dictionary型の補助関数
言語 | キーの存在確認 | キーから値を取り出し(なければ例外) | キーから値を取り出し(なければデフォルト値) | キーの一覧 | |
---|---|---|---|---|---|
CS | dict.ContainsKey(key) |
dict[key] |
dict.TryGetValue(key, out hensu) |
List<T> keys = dict.Keys.ToList() |
|
Elixir | Map.has_key?(map, key) |
map[key] |
Map.get(map, key, default_value) |
Map.keys(dict) |
|
Go | _, ok := m[key] |
v, ok := m[key] |
? |
? |
|
Python | (key in dict) |
dict[key] |
dict.get(key) |
dict.keys() |
|
Rust | ? |
map.get(key) |
map.get(key).unwrap() |
map.keys() |
|
Xojo | dict.HasKey(key) |
dict.Value(key) |
dict.Lookup(key, default_value) |
(Appendix.1)オンラインコンパイラ
いろんな言語を、ちょこっと試すのに便利な、オンラインコンパイラを探してみました。