:exit等の:のついた識別子は何ですかloopは制御構造ですかa +bがエラーになりますがs = "x"; puts s *10 がエラーになりますがp {}で何も表示されません'\1'と'\\1'はどう違いますかp true or true and falseはtrueを表示するのに、a=true if true or true and falseでは、aにtrueが代入されません。p(nil || "") はなんでもないのに、 p(nil or "") はパースエラーだと言われます:exit等の:のついた識別子は何ですかシンボルと呼ばれる、識別子と1対1対応するオブジェクトです *1。 "exit".internとしても求められます。catch, throw, autoloadなどでは、 引数として文字列もシンボルも使えます。
symbolのスコープでeval( (:symbol).id2name)とすると、
値が取り出せます。
a = 'This is the content of "a"' b = eval(:a.id2name) a.object_id == b.object_id
loopは制御構造ですかメソッドです。ブロックは新しいローカル変数のスコープを導入します。
a +bがエラーになりますがa(+b)と解析されています。+の両側の空白をなくすか、いれるか
のどちらかにしてください。
s = "x"; puts s *10 がエラーになりますがputs s *10 のところが、s(*10)というメソッド呼び出しと解析されて
しまいます。s*10にするか、s * 10にしてください。
ruby 1.8 feature: 1.8(?) 以降ではエラーになりません。
p {}で何も表示されません{}がハッシュのコンストラクタではなく、ブロックと解析されています。 p({}) か p Hash.new のようにして回避してください。
これは以下のような例です。
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 としてください。
'\1'と'\\1'はどう違いますか同じです。シングルクォートの中では、\'と\\、行末の\
(改行を無効にします)だけが解釈され、それ以外は解釈されません。
*2
p true or true and falseはtrueを表示するのに、a=true if true or true and falseでは、aにtrueが代入されません。最初の式は、(p true) or true and falseと解釈されます。
and/orは
文の構成要素として解釈され、pの引数を結ぶ演算子としては解釈され
ません。
2番目のは、a=true if (true or true and false)と解釈されています。
ifの方がand/orより優先順位が低いこと、
orとandの優先順位が同じなので、
左から順に解釈されることによります。
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[外部]