LEFログ:学習記録ノート

leflog: 学習の記録をどんどんアップしていきます

アルファベットの途中から途中までを出力したいとき:JavaScriptのcharCodeAt()メソッド、RubyのRange関数、Goのルーン型、Rustのスカラー値

アルファベットの途中から途中までを出力したいとき

JavaScriptの場合

// アルファベットのcからqまでを出力する
for (let i = 'c'.charCodeAt(0); i <= 'q'.charCodeAt(0); i++) {
    console.log(String.fromCharCode(i));
}

これはcharCodeAt()メソッドを使って、その位置から範囲を絞っています。

String.prototype.charCodeAt() - JavaScript | MDN

TypeScriptで関数定義したいときはこんな感じ。

function getAlphabetRange(start: string, end: string): string[] {
    const result: string[] = [];
    for (let i = start.charCodeAt(0); i <= end.charCodeAt(0); i++) {
        result.push(String.fromCharCode(i));
    }
    return result;
}

const chars = getAlphabetRange('c', 'q');
chars.forEach(char => console.log(char));

Rubyの場合

# アルファベットのcからqまでをRange関数を使って出力する
('c'..'q').each do |char|
  puts char
end

かなりシンプルです。

これは、RubyのRange関数を利用しています。
..、この2つのドットが、Range関数であり、範囲を表しています。

class Range (Ruby 3.2 リファレンスマニュアル)

Goの場合

package main

import (
    "fmt"
)

func main() {
    for ch := 'c'; ch <= 'q'; ch++ {
        fmt.Println(string(ch))
    }
}

Go言語では、runeという型があり、Unicodeのコードポイントを表す整数型です。

'c''q'といったシングルクォートで囲まれた文字は、実際には整数値(Unicodeのコードポイント)として扱われます。したがって、これらの文字に対して数値のように加算や比較ができます。

例えば、'c'Unicodeでのcのコードポイントである99と等価です。そのため、'c' + 1'd'を意味します。

この性質を利用して、Go言語ではアルファベットの文字を簡単に順番に処理することができます。

Golang 文字"A"の次の値として"B"を取得したい

シングルクォーテーションで文字を囲った場合、stringではなくruneと識別されるためです。
結果として、Unicodeのcode pointを整数値で表しています。

Rustの場合

fn main() {
    for ch in 'c'..='q' {
        println!("{}", ch);
    }
}

文字のUnicodeスカラー値を利用してループを実行します。

このコードでは、範囲'c'..='q'を使って、cからqまでの文字を順に取得しています。Rustの範囲は、終了を含む場合は..=を使用します。ループ内では、println!マクロを使用して各文字を表示しています。

Rustのchar型は、Unicodeスカラー値を表す32ビットの値としてエンコードされているらしいです。これにより、連続するUnicode文字を簡単にイテレートすることができるそうです。

データ型 - The Rust Programming Language 日本語版

Rustのchar型は、ユニコードスカラー値を表します。

まとめ

「アルファベットの途中から途中まで」を出力するコードを書くときには、次の2点に注意する必要がありそうです。

  • 文字列をどのような型で扱っているか
  • Range関数があるかどうか

JavaScriptにも、早くRange関数を導入して頂きたいです……(´;ω;`)