日本語文字列の文字数 / $KCODEよりも-Kオプションで

artonさんのところで話題になっていたので、わたしも書いてみました。無駄に複雑にしています。てへ♪
でも、each_charって便利ではないでしょうか。

$KCODE = 'SJIS'

class String
  def each_char
    scan(/./) do |c|
      yield(c)
    end
  end

  def char_count
    n = 0
    each_char do
      n += 1
    end
    n
  end
end

p "日本語".char_count

"日本語".each_char do |c|
  puts c
end

実行結果です。

3
日
本
語

追記:artonさんから、「$KCODEよりも-Kで」という情報をいただきました。理由はshe bang行に-Kで書いておくと読み込み時に評価してくれるから、とのこと。あっ、Windows版でもちゃんと読むんですねっ♪ 実験、実験。

#!/usr/local/bin/ruby -Ks
puts $KCODE       #=> SJIS
#!/usr/local/bin/ruby -Ke
puts $KCODE       #=> EUC
#!/usr/local/bin/ruby -Ku
puts $KCODE       #=> UTF8
#!/usr/local/bin/ruby -Kn
puts $KCODE       #=> NONE

ほんとだ…。じゃあ、「はまる」例を実際に作ってみますね。

$KCODE = SJIS
puts '表'         #=> unterminated string meets end of file
#!/usr/local/bin/ruby -Ks
puts '表'         #=> 表

確かに、artonさんのご指摘通りでした。感謝です♪
スクリプトではなく外部ファイルの読み込みについては、$KCODEへの代入で、という話題もありましたが、それはまたいつか試します。
追記:id:nurseさんから、リンク情報をいただきました。感謝♪

追記:id:nurseさんから、block_given? と /./m という追加情報をいただきました。なるほど、mオプション(Regexp::MULTILINE)を付けると、改行を含んでいたときに、その改行も一個の「文字」としてとれますね。ありがとうございます。