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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

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

Q&A

1回答

1397閲覧

undefined method `[]=' for nil:NilClass (NoMethodError) について

kwiakys

総合スコア12

Ruby

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

0グッド

0クリップ

投稿2019/07/22 16:54

編集2019/07/22 17:06

undefined method `[]=' for nil:NilClass (NoMethodError) について

###VAPSで計算を回しています.

ruby

1#!/usr/bin/env ruby 2 3require 'pp' 4require 'scanf' 5def get_vals(dir) 6 vals = [] 7 Dir.glob(File.join(dir,'*.o*')).each do |file| 8 m = File.read(file).scan(/E0= (.+) d/) 9 unless m!=[] 10 p dir 11 next 12 else 13 vals << m[-1][0].scanf("%f")[0] 14 end 15 end 16 vals 17end 18 19['relax_1st','relax_2nd','fix_1st','fix_50','fix_100','fix_150','fix_200'].each do |source| 20 puts source+":=" 21 results = [] 22 Dir.glob('*/*').each do |dir| 23 if dir.include?(source) and File.directory?(dir) 24 dd = File.dirname(dir).split('_')[-2..-1] 25 p dd[0] 26 vals = [dd[0].to_f, dd[1].to_f] 27 vals << get_vals(dir) 28 results << vals.flatten 29 end 30 end 31 pp results.sort 32 puts ";" 33end

このようなコードを作成したのですが,

出力

ruby

1/***/***/***/gets_all_results:25:in `block (2 levels) in <main>': undefined method `[]' for nil:NilClass (NoMethodError) 2 from /home/kawai/bin/gets_all_results:22:in `each' 3 from /home/kawai/bin/gets_all_results:22:in `block in <main>' 4 from /home/kawai/bin/gets_all_results:19:in `each' 5 from /home/kawai/bin/gets_all_results:19:in `<main>'

というエラーが出てしまいます[]が未定義なメソッドという意味だと思うのですが,解決することができません.
ご教授いただけると幸いです.

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

dd = File.dirname(dir).split('')[-2..-1]
の File.dirname(dir) に '
' が含まれていないため dd が nil になっているからです。

思うに、 foo/relax_1st という名前から ['foo/relax','1st'] を得たいのかな?と察するのですが、File.dirname(dir) ですと 'foo' が帰ってきてしまいますのでそこが原因でしょう。
if文で foo/relax_1st がdirであることがわかっているのですから、
dd = dir.split('_')[-2..-1]
で良いのでは?

relax と 1st に分けたいのだとすると、
dd = dir.split(/[/_]')[-2..-1]

投稿2019/07/22 21:02

winterboum

総合スコア23329

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問