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

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

ただいまの
回答率

90.34%

  • Ruby

    8178questions

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

  • Atom (テキストエディタ)

    552questions

Rubyのunexpected tlDENTIFIER,expecting keyword_endエラー

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 715
退会済みユーザー

退会済みユーザー

Rubyの以下のプログラムでunexpected tlDENTIFIER,expecting keyword_endというエラーが出てきます。
ただ、このエラーが著者名、ページ数、発刊年、発刊月、発刊日の行だけに出ていて書籍名で同じエラーが出ていません。
以前にも同じような質問をして二つ目のプログラムに変えて解決したのですが自分のプログラミングは教本を丸写ししたもので、gets.chompとgets.chomp.to_iが使えないのなら買った教本のほとんどが間違っているかと疑ってしまいます。(訂正はありませんでした)
教本ではテキストエディタに関しては軽く触れるぐらいでした。
だから、その設定でミスをしている?のかRubyのバージョンの違いでこうなってるのかなと思っています(本が少し古い)。
ATOMを使っています。
エラーが出る理由を教えてください。

def addBookInfo
    book_info = BookInfo.new( "", "", 0, Date.new )
    print "\n"
    print "キー: "
    key = gets.chomp
    print "書籍名: "
    book_info.title = gets.chomp
    print "著者名: "
    book_info.author = gets.chomp
    print "ページ数: "
    book_info.page = gets.chomp.to_i
    print "発刊年: "
    year = gets.chomp.to_i
    print "発刊月: "
    month = gets.chomp.to_i
    print "発刊日: "
    day = gets.chomp.to_i
    book_info.publish_date = Date.new( year, month, day )
    @book_infos[key] = book_info
end
 def addBookInfo
  book_info = BookInfo.new( "", "", 0, Date.new )
  print "\n"
  print "キー: "
  key = gets.chomp.encode("UTF-8")
  print "書籍名: "
  book_info.title = gets.chomp.encode("UTF-8")
  print "著者名: "
  book_info.author = gets.chomp.encode("UTF-8")
  print "ページ数: "
  book_info.page = gets.chomp.encode("UTF-8").tr("0-9","0-9").to_i
  print "発刊年: "
  year = gets.chomp.encode("UTF-8").tr("0-9","0-9").to_i
  print "発刊月: "
  month = gets.chomp.encode("UTF-8").tr("0-9","0-9").to_i
  print "発刊日: "
  day = gets.chomp.encode("UTF-8").tr("0-9","0-9").to_i
  book_info.publish_date = Date.new( year, month, day )
  @book_infos[key] = book_info
end
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+2

このファイルの文字コードがUTF-8でないためではないかと思います。
UTF-8で保存して下さい。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/09 15:46

    Atomのファイルエンコーディングはutf8になっているのでそこは大丈夫だと思います。

    キャンセル

  • 2017/01/09 20:30

    プログラムに見た目での文法エラーは無いですし、実際にこのファイルをシフトJIS等で保存して実行すると同じエラーが出ますので、何らかの勘違いがあると思います。よく確認してください。
    また、エラーメッセージを省略せず全文載せてください。

    キャンセル

  • 2017/01/11 19:24

    返信遅くなってすみません。
    自己解決しました。
    原因はよくわかってません。
    親切にありがとうございます。

    キャンセル

checkベストアンサー

+1

前のプログラムの該当箇所を上から下に差し替えたという理解であっているでしょうか?
そのように仮定して、手を加えて実行してみたところ上のエラーは出ませんでした。
私もよくそのエラーを出します。私の場合はだいたいendの数が多かったり少なかったり
することが原因です。
私もAtomを使っています。

require 'date'

class BookInfo
  def initialize( title, author, page, publish_date )
    @title = title
    @author = author
    @page = page
    @publish_date = publish_date
  end

  attr_accessor :title, :author, :page, :publish_date
  def to_s
    "#{@title}, #{@author}, #{@page}, #{@publish_date}"
  end

  def toFormattedString( sep = "\n" )
    "書籍名: #{@title}#{sep}著書名: #{author}#{sep}ページ数: #{@page}ぺ―ジ#{sep}発刊日: #{@publish_date}#{sep}"
  end
end

class BookInfoManager
  def initialize
    @book_infos = {}
  end

  def setUp
   @book_infos["Yamada2005"]  = BookInfo.new(
   "実践アジャイル ソフトウェア開発法とプロジェクト管理",
   "山田 正樹",
    248,
  Date.new( 2005, 1, 25 ) )
   @book_infos["Ooba2006"] = BookInfo.new(
   "入門LEGO MINDSTORMS NXT レゴブロックで動くロボット",
   "大庭 慎一郎",
   164,
   Date.new( 2006, 12, 23 ) )
  end

  def addBookInfo
    book_info = BookInfo.new( "", "", 0, Date.new )
    print "\n"
    print "キー: "
    key = gets.chomp.encode("UTF-8")
    print "書籍名: "
    book_info.title = gets.chomp.encode("UTF-8")
    print "著者名: "
    book_info.author = gets.chomp.encode("UTF-8")
    print "ページ数: "
    book_info.page = gets.chomp.encode("UTF-8").tr("0-9","0-9").to_i
    print "発刊年: "
    year = gets.chomp.encode("UTF-8").tr("0-9","0-9").to_i
    print "発刊月: "
    month = gets.chomp.encode("UTF-8").tr("0-9","0-9").to_i
    print "発刊日: "
    day = gets.chomp.encode("UTF-8").tr("0-9","0-9").to_i
    book_info.publish_date = Date.new( year, month, day )
    @book_infos[key] = book_info
  end
  def listAllBookInfos
  puts "\n---------------------"
  @book_infos.each { |key, info|
  print info.toFormattedString
  puts "\n----------------------------"
  }
  end
  def run
    while true
      print "
      1.蔵書データの登録
      2.蔵書データの表示
      9.終了
      番号を選んでください(1,2,9) :"

     num = gets.chomp.encode("UTF-8").tr("0-9","0-9").to_s
     case
     when '1' == num
      addBookInfo
     when '2' == num
      listAllBookInfos
    when '9' == num
      break;
    else
    end
    end
  end
    book_info_manager = BookInfoManager.new
    book_info_manager.setUp
    book_info_manager.run
  end


前回のプログラムのうち、該当箇所を入れ替えたものです。
入力したデータは以下のとおりです。

(キー)821227(半角)
(書籍名)ももたろう
(著者名)山田 鈴木(山田<スペース>鈴木)
(ページ数)821(半角)
(発刊年)1981(半角)
(発刊月)4(半角)
(発刊日)6(半角)


この内容で私が実行したところ、エラーは発生しませんでした。
実行結果例

----------------------------
書籍名: ももたろう
著書名: 山田 鈴木
ページ数: 821ぺ―ジ
発刊日: 1981-04-06

----------------------------


質問者様はエラーが発生するでしょうか?
もしこれでエラーが発生するようならプログラム
以外に問題があるのかもしれません。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/09 17:34

    その通りです。
    endの数も間違ってません。
    何回もファイルを消して初めから書き直してやっているのですが、毎回エラーが出てくじけてます。
    `addBookInfo': uninitialized constant BookInfoManager::BookInfo (NameError)というのがコマンドプロンプトで出て、AtomではaddBookInfo内のprint""に
    unexpected tlDENTIFIER,expecting keyword_endが大量に出ています。
    全角スペースもないし、著者名ででるエラーが書籍名ででないのがわからない。

    キャンセル

  • 2017/01/09 17:38

    プログラム全体を見せていただけるとありがたいです。

    キャンセル

  • 2017/01/09 17:41

    もし加え差し支えがなければ入力した文字も教えて頂けると、エラーを再現しやすくなると思います。

    キャンセル

  • 2017/01/11 19:24

    返信遅くなってすみません。
    自己解決しました。
    原因はよくわかってません。
    親切にありがとうございます。

    キャンセル

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

  • Ruby

    8178questions

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

  • Atom (テキストエディタ)

    552questions