Ruby で /\w/ な文字からなる文字列を生成する

丁稚な日々 経由で、はてなこんな質問…っていうか挑戦?


SqueakSmalltalk で書き下すとこんな感じ。

(($0 to: $z) as: String) select: [:each | each isAlphaNumeric or: [each = $_]]


これだけで終わらせるのもなんなので、Ruby の勉強を兼ねて、最短解までの短さは無理でも、比較的短めに、かつ、最短解よりは“何がしたいのか”をもう少し読んで分かりやすく表現することはかなわないものか…と、しばし、リファレンスに首っ引きになりながらもチャレンジ。 で、こんなん出ました。

(?0..?z).map{|e|e.chr=~/\w/&&$&}.to_s

ちっ。一文字、多い。w


追記
丁稚な日々 に、eban さんの手による、さらに短い解が登場。[/\w/] で && $& を省略できるのですね。すばらしい。

(?0..?z).map{|e|e.chr[/\w/]}.to_s


追々記:
丁稚な日々 を読んでいて、なるほどこういう書き方もあるなぁ…と感じ入ったので。SqueakSmalltalk ですと、こんなふう。

($0 to: $9), ($A to: $Z), #($_), ($a to: $z) as: String


ケント・ベックSBPP 的にはこっち?

String withAll: ($0 to: $9), ($A to: $Z), #($_), ($a to: $z)


文字コード表上の配置に依存しないし、一部の例外を排除するためだけの大がかり(?)なループを回す必要もなく、なにより素直ですよね。