: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.id == b.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]