アルファベットの途中から途中までを出力したいとき
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言語ではアルファベットの文字を簡単に順番に処理することができます。
シングルクォーテーションで文字を囲った場合、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 日本語版
まとめ
「アルファベットの途中から途中まで」を出力するコードを書くときには、次の2点に注意する必要がありそうです。
- 文字列をどのような型で扱っているか
- Range関数があるかどうか
JavaScriptにも、早くRange関数を導入して頂きたいです……(´;ω;`)