4. 構文

4.1 :exit等の:のついた識別子は何ですか

シンボルと呼ばれる、識別子と1対1対応するオブジェクトです *1。 "exit".internとしても求められます。catch, throw, autoloadなどでは、 引数として文字列もシンボルも使えます。

4.2 シンボルと同名の変数の値を取り出すにはどうすればいいですか

symbolのスコープでeval( (:symbol).id2name)とすると、 値が取り出せます。

a = 'This is the content of "a"'
b = eval(:a.id2name)
a.id == b.id

4.3 loopは制御構造ですか

メソッドです。ブロックは新しいローカル変数のスコープを導入します。

4.4 a +bがエラーになりますが

a(+b)と解析されています。+の両側の空白をなくすか、いれるか のどちらかにしてください。

4.5 s = "x"; puts s *10 がエラーになりますが

puts s *10 のところが、s(*10)というメソッド呼び出しと解析されて しまいます。s*10にするか、s * 10にしてください。

ruby 1.8 feature: 1.8(?) 以降ではエラーになりません。

4.6 p {}で何も表示されません

{}がハッシュのコンストラクタではなく、ブロックと解析されています。 p({}) か p Hash.new のようにして回避してください。

4.7 pos=() という setter メソッドがあるのに、pos = 1 としてもなにも起こっていないように見える

これは以下のような例です。

class C
  attr_reader :pos
  def pos=(n)
    @pos = n * 3
  end

  def set
    pos = 1   #A
  end
end

a = C.new
a.set
p a.pos    #=> nil (3 を期待していた)

最後の行で 3 を期待しても、実際には nil になります。 Ruby は A の行をローカル変数への代入と解釈するからです。 pos=() の呼びだしにするには self.pos = 1 としてください。

4.8 '\1''\\1'はどう違いますか

同じです。シングルクォートの中では、\'\\、行末の\ (改行を無効にします)だけが解釈され、それ以外は解釈されません。 *2

4.9 p true or true and falsetrueを表示するのに、a=true if true or true and falseでは、atrueが代入されません。

最初の式は、(p true) or true and falseと解釈されます。 and/orは 文の構成要素として解釈され、pの引数を結ぶ演算子としては解釈され ません。

2番目のは、a=true if (true or true and false)と解釈されています。 ifの方がand/orより優先順位が低いこと、 orandの優先順位が同じなので、 左から順に解釈されることによります。

4.10 p(nil || "") はなんでもないのに、 p(nil or "") はパースエラーだと言われます

|| は引数を結ぶことができますが、or は文と文を結ぶことしかできず、 引数を結ぶことができないからです。この違いは、たとえば以下のふたつの 式の結果がどうなるか試してみればわかります。

p nil || ""
p nil or ""

*1version 1.4 以前はシンボルは整数(Fixnum)で実装されていました。現在はSymbolクラスのインスタンスです
*2ruby 1.8 feature: 1.8.1(?) 以降ではシングルクォートで囲まれ た文字列では行末の\は \ そのものとして解釈されます。[ruby-dev:21339]



rubyist ML