報國挺身日記 このページをアンテナに追加 RSSフィード

2006/03/24 暴徒と経済的愛国主義

[] 第六話 オプションがいっぱい 23:11

今日初めて知った。

/.../xxxxiiimmmnnnnoooooouuueeeesssss

2006/02/14 無意味なバレンタインデー

[] 第五話 ネストメソッド 00:12

メソッドは以下のようにネストして書ける。

def foo
  def bar
  end
end

どうしてこれを許しているのか、最近まで判らなかった。

bar()がfoo()の中でしか使用できないようになっているのであれば意味があるが、実際にはそうなっていないのだから。しかし、yarv-dev MLのログを読んでいるうちに理由がわかった。

以下のように書きたいことがあるからだろう。

def foo
  String.module_eval {
    def bar()
      ...
    end
  }
end

ブロックが間に入っているが、これもメソッドがネストしているのは確かだ。しかし、これはネストメソッドであることに特別の意味があるわけではなく、コードを書く側もそれを期待してはいない。そうであれば、ブロックを間に挟まないネストメソッドは禁止して、ブロックを挟む場合には許すが、これはネストメソッドではなく通常のメソッドであると言う仕様で問題ないのではなかろうか。そうすれば、ネストメソッドをメソッド内のローカルメソッドとして機能させるという、面倒な実装をしなくて済むだろう。

ささだささだ 2006/02/14 02:57 じゃなくて,メソッドを定義するメソッドをただ単に書きたかっただけらしいです.

kkoskkos 2006/02/14 22:05 残念。でも本当に必要性があるのかなあ。method_missing()の定義をしたいということか?

まつもとまつもと 2006/02/15 08:24 必要性はないです。「とりあえずやってみたかった」くらいで。将来、もっとちゃんとした仕様が決まれば遠慮なく変更します。

kkoskkos 2006/02/16 00:06 了解しました。

2006/02/06 とにかく寒い

[] 第四話 変なcase 22:16

case文では、以下のように、場合分けの対象となる値を書かない記述が許される。

case
when false, nil
  p "first"
when false, 10, nil
  p "second"
else
  p "else"
end

#=> "second"

これは、whenの中で真になる値があった節が実行されるという意味で、結局、if...elsif...endに対する少し変わった書き方ということになる。

さらに、when節を全く書かない記述も許されている。

case
else
  p "else"
end

#=> "else"

この場合、else節の中が必ず実行される。

飴谷飴谷 2006/02/07 14:40 ONIGRUMAのAPIを見に来て立ち寄りました。

ThunderBirdの件ですが、以下の手順の操作じゃ駄目でしょうか?

1.ツールバーからオプションを選択
2.オプション画面の左側の編集アイコンをクリック
3.右下の送信テキスト形式ボタンをクリック
4.送信テキスト形式画面の「テキスト形式」にありますコンボボックスをクリックして、「プレーンテキストに変換して送信する」

kkoskkos 2006/02/07 21:26 あ、ありがとうございます。助かりました。
やはり勘違いをしていたようです。

飴谷飴谷 2006/02/07 23:42 1つ目は、よかったです。
2つ目の引用文の件ですが、昔ながら「>」にするという拡張はあります。
https://addons.mozilla.org/extensions/moreinfo.php?id=170&application=thunderbird

ちなみに、私もDaturaユーザでした。惜しいソフトがなくなったものです。

kkoskkos 2006/02/08 00:17 引用文、うまくいきました。
素晴らしい。
本当にありがとうございます。

2006/01/30 また風邪を引いた

[] 第三話 begin...end 22:08

begin...endというのは、rescueやensure節と一緒に使用することが殆どだと思うが、これは、意外な場所で使用できる。

たとえば、以下のようにスーパークラスを指定する場所にも書ける。

class Foo < begin p(x = Class.new); x end
  p superclass
end

実際には、使用できない場所を見つけるほうが難しいくらいだ。

p 10, begin 10; 20 end, 30
#=> 10 20 30

begin
  a = [1,2,3]
end[1] = 100
p a  #=> [1, 100, 3]

のように書けてしまう。

それも当然で、begin...endを、Rubyは式として処理しているのだった。

2006/01/28 今日もまた歯医者で治療

[] 第二話 rescueと代入 22:01

以下のように書くと、どう解釈されるのか?

a = (raise "") rescue 10
p a  #=> 10

rescueの結果がaに代入されている。

従って、次のように解釈されていることがわかる。

a = ((raise "") rescue 10)

rescueが代入よりも優先順位が高いように見える。

しかし、次の文はどうなるだろうか?

c = (raise "") rescue (raise "") rescue 20
p c #=> nil

これは、次のようには解釈されていない。

c = ((raise "") rescue (raise "") rescue 20)
p c #=> 20

Rubyの奥深さを思い知らされる。