• ベストアンサー

消えたコロン

消えたコロン 以下のプログラムを実行すると、「ruby」と出力されます。なぜ「:」が表示されないのか、納得できません。どなたか、理由を解説できる方はいらっしゃいませんでしょうか?なるべく簡単な言葉でお願いします。 def func(x) puts(x[:name]) end func(:date =>Time.now, :name => :ruby, :version => 1.9)

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.4

どうしてもわからなければ、「文字列とシンボルは兄弟」と思ってください。 プログラム中に文字列を書くときは、" " や ' ' などで囲みます。 プログラム中にシンボルを書くときは : を前置します(:" " や :' ' で囲んでも良い)。 "abc" == %+abc+ #⇒ 真(同じ文字列の別の書き方。入門書の「%記法」参照) :abc == :"abc" #⇒ 真(同じシンボルの別の書き方) ★文字列に対してシンボルの長所 代入や等値比較が速い ★文字列に対してシンボルの短所 大小比較が出来ない。正規表現とマッチできない。分解・連結・部分取り出し・書き換えなど加工・編集など一切が出来ない。多分まだまだある。 そういえば、以前もシンボルの説明をしました。 http://okwave.jp/qa/q5800523.html ここに書きましたが、ハッシュのキーでは、文字列よりシンボルが好んで使われます。長所が生きて、短所が関係ないので。 なお、to_s と to_sym で相互変換できます。 "abc" == :abc #⇒ 偽 (文字列とシンボルは等しくない) "abc" == :abc.to_s #⇒ 真 (変換して文字列同士の比較で等しい) "abc".to_sym == :abc #⇒ 真 (変換してシンボル同士の比較で等しい) putsに対しても相当の誤解があるようですが、どこから説明したものか。 「メソッドとは何か」をまず勉強するのかな。「たのしいRuby」等の定評のある入門書を虚心に読む。

ghfjri
質問者

お礼

ありがとうございました。 やっぱり私の知識がぜんぜん足りないみたいですね。 実はここで私が使っている本について数回質問したことがあるのですが、 みなさん微妙な反応でした。 やっぱり「たのしいRuby」を買おうと思い、先ほどアマゾンで注文しました。 結構経済的に厳しいですが、がんばってRubyを覚えたいと思います。

その他の回答 (3)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

>この式は演算子(:name)のハッシュ値として演算子(:ruby)を設定してい 「演算子」という言葉も間違ってますね。 それはさておき、 puts :name で、:name でなく name が表示されるのが不思議ということですが、 puts "name" で、"name" でなく name が表示されるのは不思議ですか?不思議じゃないですか?

ghfjri
質問者

お礼

回答ありがとうございます。 演算子間違ってますね。確認しました。 puts "name" で、"name" でなく name が表示されるのは不思議ではありません。puts("")は""の中を返すメソッドだからです。 しかし、puts :nameは見たことがないのでわかりません。putsといえば、("")がついているものか、(変数名)がついているものしか本に出てなかったので・・・。ネットで明日(今日?)もう一度調べます。

ghfjri
質問者

補足

やはりputs :nameみたいな使い方が解説されているとこは見つかりません・・・。 シンボルの癖にシンボル扱いされてないのはなぜなんでしょうか?

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

:ruby というのは ruby という文字列表現を持つシンボル(Symbolクラスのオブジェクト)です。 同様に、 :+ というのは + という文字列表現を持つシンボル。 :" " というのは、空白1文字の文字列表現を持つシンボル。 シンボルという物が何かを理解されてないのでは?と思います。シンボルを簡単に説明するのは難しいですね。「構文解析時に1ワードにしてしまった文字列」でわかりますか? 例えば、aに文字列が代入されているとして、a == "abcdef" という文字列同士の比較だと、C言語レベルでは、strcmpという関数で文字列を一文字ずつ順に比較することになります。 今度は a にシンボルが代入されているとして、a == :abcdef だと、C言語レベルでは整数同士の比較1回で比較が完了します。従って文字列より処理が早いので、加工不要な文字列、例えばメソッドのパラメータなどでよく使われます。

ghfjri
質問者

お礼

回答ありがとうございます。 いちおう入門書でシンボルのところは読んだのですが、確かに理解していないかもしれません。 この式はその入門書のハッシュのところの練習問題です。 この式は演算子(:name)のハッシュ値として演算子(:ruby)を設定していて、演算子:rubyを設定してないのに、コロンなしのrubyが返ってくるのが不思議だと思っています。 やはりシンボルが理解できていないのでしょうか? RubyしかやったことないのでC言語での説明はちょっとわかりません。

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

puts :ruby とはすなわち puts :ruby.to_s だからです。 いやなら p :ruby でどうぞ

ghfjri
質問者

お礼

回答ありがとうございます。 puts :rubyがすなわちputs :ruby.to_sである。 puts :ruby.to_sは、:rubyを文字列で返すということですよね? なぜコロンが消えるのでしょうか? もう少し説明してくださるとうれしいのですが・・・。

関連するQ&A