Почему я получаю ошибку «без метода» для простой операции добавления матрицы в Ruby? Много по сути одинаковых строк в других моих программах - PullRequest
0 голосов
/ 20 апреля 2020

Вот сообщение об ошибке:

EvoWithout.rb: 53: в блоке (2 уровня) в: неопределенный метод `+ для nil: NilClass (NoMethodError)

Вот строка 53:

if behavior[i,0] > Thrsh && s == 0 then animal[i,0]+= 5 end

Вот соответствующий код:

situation= Matrix[ [1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0],
                   [1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1],
                   [1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1],
                   [1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1],
                   [1,0,0,1,1,0,1,0,1,0,1,0,1,0,0,1] ]
# Build brain with $Behavmax rows of 0,1's
brain = Matrix.build(10,16) { 1 }
for i in (0..$Behavmax)
    for j in (0..$Stimmax)
        if rand(4) < 1.1 then brain[i,j] = 0 end
    end # j
end #i
stimulus=Matrix.column_vector([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
behavior=Matrix.row_vector([0,0,0,0,0,0,0,0,0,0])
animal=Matrix.row_vector([20,20,20,20,20,20,20,20,20,20]) # to hold value of fitness
# BEGIN MAIN PROGRAM
# Noise=20
# Go through once presenting 1 situation after another
for s in (0..4)
    for j in (0..$Stimmax)
        stimulus[j,0] = situation[s,j]
    end # for j
    # GENERATE BEHAVIOR
    behavior=brain*stimulus 
     for i in (0..$Behavmax) #fire iff stimulus pattern matches detector
        if behavior[i,0] > Thrsh && s == 0 then animal[i,0]+= 5 end
        #if behavior[i,0] > Thrsh && s != 0 then  print "Behavior#{i}=#{behavior[i,0]} and s=#{s}   " end
     end # for i
    puts
end # for s

1 Ответ

1 голос
/ 21 апреля 2020

Важным навыком для изучения является чтение сообщений об ошибках и предупреждений. В заголовке вы спрашиваете:

Почему я получаю ошибку «без метода» для простой операции добавления матрицы в Ruby?

Но это не что говорит сообщение об ошибке!

Вы не получаете NoMethodError для операции добавления матрицы (Matrix#+). В противном случае сообщение об ошибке будет иметь следующий вид:

EvoWithout.rb:53:in `block (2 levels) in ': undefined method `+' for animal:Matrix (NoMethodError)

Обратите внимание, что в сообщении об ошибке будет указано ( жирный выделение мое) "неопределенный метод" + "для animal : Matrix"(что было бы неправильно, поскольку существует Matrix#+). Однако, это не то, что говорит ваше сообщение об ошибке. Ваше сообщение об ошибке гласит ( жирный выделение):

неопределенный метод `+ 'для nil: NilClass

, который является правильным, потому что NilClass на самом деле не имеет метод +, а также его суперклассы Object, Kernel и BasicObject.

Итак, вы ищете не в том месте: ваша проблема не в операции добавления матрицы, ваша проблема в том, что ваша матрица index операция возвращает nil.

И причина этого довольно проста: ваша матрица animal содержит только одну строку, но вы перебираете строки $Behavmax + 1. Итак, как только $Behavmax станет больше нуля, вы попадете во второй ряд animal, которого не существует. Следовательно, он вернет nil, и ваше добавление не удастся.

Помните, что a ω= b для любого оператора ω и произвольных выражений a и b эквивалентно a = a ω b с a оценивается только один раз, поэтому

animal[i,0]+= 5

примерно эквивалентно:

__temp__ = animal[i, 0]
animal[i, 0] = __temp__ + 5

И если i отличается от 0, __temp__ будет nil потому что в animal.

есть только одна строка
...