質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Ruby

    7677questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

配列の中のハッシュをto_aで表示

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 112

shirou

score 9

 期待結果

この結果が得られるメソッドの定義について
clever_print(["Ruby"], "the", ["Programming", "Language"])
=> Ruby the Programming Language

clever_print(["Agile", "Web", "Development"], "with", { :Rails => 3.0 })
=> Agile Web Development with Rails 3.0
問題原典-ミニツクより

 模範回答コードより生じたエラー・下自作コードの場合

Main.rb:8:in `block in clever_print': undefined method `to_a' for "the":String (NoMethodError)
Ruby the Programming Language
Agile Web Development with {:Rails=>3.0}

 模範回答コード

def clever_print(*args)
  converted = []
  args.each { |arg| converted << arg.to_a }
  puts converted.join(" ")
end

 自作コード

def clever_print(*num)
    array = []
    array << num.to_a
    puts array.join(" ")
end

 試したこと

メソッドより受け取った引数を配列に直した上で、配列の要素として出力すればto_aメソッドはレシーバ自身を返す為に、期待結果に至るだろうと予想。
残念ながらハッシュは外れなかった為、ミニツクサイトにあった模範回答コードを試してみることに。
すると模範回答コードがエラーを吐き出してはありませんか・・
打つ手がなくなり質問に至ります。

 補足情報(FW/ツールのバージョンなど)

実行環境はpaiza.io こちらです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

エラーの原因は、既にある回答の通りですが、

class String
  def to_a
    [self]
  end
end


とすれば、「模範解答」はとりあえず動きます。あんまり模範解答な気はしませんが。

趣旨をくんで書き直すとこんな感じでしょうか。

def clever_print(*args)
    puts args.map{|x| x.respond_to?(:to_a) ? x.to_a : x}.join(" ")
end

また、質問者のコードは、

  def clever_print(*args)
    puts args.to_a.join(" ")
  end


と同じです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/15 20:29

    回答ありがとうざいます!
    ようやくなぜ頂いたコードで期待結果が得られるのか理解できました。
    引数をそれぞれ取り出した上で直接to_aメソッドを用いると、文字列要素が含まれている箇所がエラーを起こす為、条件分岐で適用される箇所を分けたということ。
    そして自作コードの場合では配列を取り出すeachもしくはmapメソッドの記述がない為に、[]だけを外す処理になっていたということですね。

    キャンセル

  • 2018/07/15 21:15

    Stringかどうかで判断せず、to_aメソッドを持っているかどうかで判断するのがRuby風です。他のto_aを持たないクラスであっても良いように。

    joinによって、配列各要素に対してStringでないものはto_sが自動的に呼ばれます。

    また質問者のコードは、結局 args.join(" ") と同じです。Arrayにto_aしても不変なので。

    キャンセル

+1

Ruby 1.9でStringまわりの処理が変わったので、String#to_aは1.8.7以下のRubyにしかありません。ということで、参考にしたサイトがかなり古い可能性があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/15 18:59

    言語の基礎的な部分を古い参考資料で学ぼうとするのは、このようにトラブルになったり、今ならすんなりできることを回りくどく書いてあったりして、手間になるだけです。別なもので進めることをおすすめします。

    キャンセル

  • 2018/07/15 19:02

    Rubyのバージョンは明記されていませんが、同じサイトのRailsのバージョンが2.3.8ということで、確実に古すぎます。

    キャンセル

  • 2018/07/15 19:36

    Ruby versionはご指摘通り1.8.7以下の環境で書かれたサイトになります。
    仰られる通り、参考サイトがかなり古いので別のサイトの利用に移行します。
    回答ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    配列の中のhashをマージしたい

    ary = [{"num"=>"1", "商品名"=>"チョコ", "4/12"=>"7", "4/13"=>"9", "4/14"=>"10", "4/15"=>"10", "4

  • 解決済

    Rubyのコードについて。

    ご協力お願いします。以下のrubyのコードで、エラーではないのですが、gets.chompした後に欲しい値が取れず、そのまま終わってしまいます。なぜなのかご説明お願いします!!

  • 解決済

    ある文字列から、与えられた条件に従って文字列を抽出する。

    前提・実現したいこと 1行目の入力のスペースで区切られた文字列、タグA、タグBで囲まれた文字列を2行目の入力の文字列Sから抽出して出力します。  タグAを開始タグ、タグBを終了

  • 解決済

    Ruby 変数の定義

    Ruby初心者です。 (初心者を名乗っていいのかすら微妙) http://www.str.ce.akita-u.ac.jp/~gotou/zyouhou/ruby/#

  • 解決済

    ソースコード添削お願いします。

    該当のソースコード day_sum = gets.chomp.to_i weathers = gets.chomp.split(",") weathers.each do|weat

  • 受付中

    Ruby : メソッド定義について

    テキスト処理についてのコードです。 Rubyでテキスト処理をしているのですが、同じような繰り返しが2回あるので、なんとかメソッドにして綺麗にコードを書けないかなと思って、試して

  • 解決済

    Ruby ハッシュのキーを変数で使いたい

    前提・実現したいこと Rubyの初心者です。 ハッシュのキーを変数で利用したいのですが、nilが帰ってきてしまいます。 R[:I]のように直接シンボルを書かずに、キーを変数で使

  • 解決済

    ruby 読み込んだJSON ハッシュ Hash[:key] で取得できない Hash['key']...

    JSON を読み込んでハッシュにしたものが、 ハッシュ[:キー] で取得できません。これはなぜでしょうか。 ハッシュ['キー'] ならできました。 通常は ハッシュ[:キー] 

同じタグがついた質問を見る

  • Ruby

    7677questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。