正規表現
正規表現でなんだかうまくいかないです。
def word_capitalize(str) str.gsub!(/[^\-]+/) do |matched| matched.capitalize! end return str end p word_capitalize("in-reply-to") #=> "In-Reply-To" p word_capitalize("X-MAILER") #=> "-Mailer"
アルファベットとハイフンからなる文字列を与えると、ハイフンで区切られた部分をcapitalizeするメソッドの定義なんですが2つ目の方はうまくいかないです。
なんでかなって思ってたんですが、色んな文字列で試してたら原因がわかりました。
原因は、String#capitalize!が大文字と小文字の変換ができなかったら、nilを返すからでした。
すっかり忘れてました。
ということで、それを踏まえて書き直しです。
def word_capitalize(str) str.gsub!(/[^\-]+/) do |matched| matched.capitalize end return str end p word_capitalize("in-reply-to") #=> "In-Reply-To" p word_capitalize("X-MAILER") #=> "X-Mailer"
書きなおしといっても、capitalize!をcapitalizeに変えただけです。
破壊的なメソッドにしないと書き換えてくれないように思えて、
capitalize!にしてましたが、capitalizeでもちゃんと書き換えてくれますね。
破壊的なメソッドはnilを返したりするときは、こういうことになるので、
破壊的なメソッドの扱いには気をつけないとなって思いました。
macでncurses
タイトルどおり、macでncursesライブラリの関数を使ったプログラムを作りたくて、
作って、それをコンパイルしてみたらエラーが出て来ました。
xcodeのcommand line toolsで入れたgccを使ってたんですが、
このgccのバージョンは4.2らしく、こいつは、色々できないことがあるそうです。
それで、homebrewを使ってgcc4.9をインストール。
which gccをすると
/usr/bin/gccを使っているようだったので、
$ sudo ln -s /usr/local/bin/gcc-4.9 /usr/bin/gcc
で無理やりgcc で gcc4.9を使えるようにしました。
しかし、ターミナルの文字エンコーディングを、unicodeにしないと、出力をしてくれません。
でも、unicodeだと、実行が終わった後に、ターミナルがおかしいことに。
やっと解決できたと思ったのに、できてませんでした。
今日はもう眠いので諦めて寝ます。
明日、もっと色々調べて解決させようと思います。
配列
配列で注意しないといけないなっと思ったことがあったのでまとめ。
array[n] = itemでarray[n]の要素をitemに変更できて、
この場合、まだ定義されていないインデックスへの置き換えは、そのまま行われます。
例えば、
alpha = %w(a b c d e f) alpha[6] = "g" p alpha #=> ["a", "b", "c", "d", "e", "f", "g"]
この時、連続しないインデックスへの置き換えを行ったとき、間にはnilが入ります。
alpha = %w(a b c d e f) alpha[7] = "h" p alpha #=> ["a", "b", "c", "d", "e", "f", nil, "h"]
これは参照した時も同じで、まだ定義されていないインデックスを参照した時も、nilを返します。
alpha = %w(a b c d e f) p alpha #=> nil
ここからが本題です。
array[n..m],array[n...m]やarray[n,len]などのを使って、複数を置き換えるときは注意が必要です。
alpha = %w(a b c d e f) alpha[2..4] = ["C","D"] p alpha #=> ["a", "b", "C", "D", "f"] alpha = %w(a b c d e f) alpha[2,3] = ["C","D"] p alpha #=> ["a", "b", "C", "D", "f"]
alpha = %w(a b c d e f) alpha[2..4] = ["C","D","E","F"] p alpha #=> ["a", "b", "C", "D", "E", "F", "f"] alpha = %w(a b c d e f) alpha [2,3] = ["C","D","E","F"] p alpha #=> ["a", "b", "C", "D", "E", "F", "f"]
このように、置き換えるはずの要素数より少なくすると、残りの置き換えられるはずだった要素がなくなります。
逆に、置き換えるはずの要素数より多くすると、その先の要素が置き換えられることはないです。
後者は、array[n,0] = itemを使って、nの要素の前に挿入していくことにも使われてますね。
前者の場合、置き換えられずに終わると思ったので、自分の予想と違ったので、注意して使おうと思います。
そういう状況になることがあるのかわかりませんが。
解決
前回の記事のことは、
print("Hello,#{name}.\n") print("Hello,"+name+".\n")
のどっちかを使えば解決することを教えていだきました。
上の方は、自動でto_sされるのでキャストしなくていいので便利です。
もしも、nameがIntegerクラスだったりしたら、
print("Hello,"+name.to_s+".\n")
としないといけないので、下はちょっとめんどくさいですね。
上だと何か困ることがあるのか、今の段階で僕にはわかりませんが、
僕は基本的に上のほうで書いていこうと思います。