hotch-potch, Note to self

いろいろ作業記録

言語比較文化~ForEach構文

1.はじめに

色々なプログラミング言語を使う機会が増えてきて、同じことを他の言語で実装するときに、「どうだったかな?」と調べる機会が増えてきました。

そうする中で、プログラム言語ごとの”文化”とも言える構文の違いを比べると、非常に興味深い知見が得られます。 今回は、主要な言語における、配列展開をするFor Each構文の書き方をまとめてみました。

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)オンラインコンパイラ

いろんな言語を、ちょこっと試すのに便利な、オンラインコンパイラを探してみました。

(Appendix.2)参考資料