1

以下のプログラムは、以前に Basic と Pascal で作成しましたが、現在は Ruby に移植しています。20 行目から 26 行目の put は、basic と pascal のサブルーチン (gosub..return) の呼び出しを表しています。Ruby にはサブルーチンがありません。これらのそれぞれに対してメソッドを作成しますか? サブルーチンは、グラフィック表示、脳マトリックスの操作などです。それらが終了したら、同じ場所に戻ることが重要です。

(有用な場合: キーを押すなどの外部イベントは、刺激マトリックスに値を入れます。脳のマトリックスを掛けると、行動マトリックスの値が生成されます。) 行 20..26 を実行するよりエレガントな方法は次のとおりです。も歓迎します。

ありがとう。

require 'matrix'
class Matrix
  def []=(i, j, x)
    @rows[i][j] = x
  end
end #code to allow putting individual elements in matrix at i,j

brain=  Matrix[ [0,0,0,0,99,0,0,0,0,1,0],
            [0,0,0,0,0,99,0,0,0,1,0],
            [0,0,0,0,0,0,99,0,0,1,0],
            [25,0,0,0,0,0,0,1,-1,1,-99],
            [0,23,0,0,0,0,0,1,-1,1,1],
            [0,0,24,0,0,0,0,1,-1,1,1],
            [0,0,0,22,0,0,0,1,-1,1,1] ]
stimulus=Matrix.column_vector([0,0,0,0,0,0,0,0,0,0,0])
behavior=Matrix.column_vector([0,0,0,0,0,0,0])

t=500 # t=threshold
behavior=brain*stimulus
if behavior[0,0] > t then puts "do poistive fixer" end
if behavior[1,0] > t then puts "do negative fixer" end
if behavior[2,0] > t then puts "show UCR" end
if behavior [3,0] > t then puts "show operant 1" end
if behavior[4,0] > t then puts "show operant 2" end
if behavior[5,0] > t then puts "show operant 3" end
if behavior[6,0] > t then puts "show operant 4" end
4

1 に答える 1

4

はい、メソッドは、サブルーチンと同じように、再利用可能なコードの塊です。

20-26 の最も速いリファクタリングは次のようになります。

puts "do positive fixer" if behavior[0,0] > t
puts "do negative fixed" if behavior[1,0] > t

最小限の節約を好むかどうかは、意見の問題です。

次のレベルのリファクタリングは、文字列を配列に入れるのと同じくらい簡単かもしれません (テストされていませんが、近い):

do_this = [ "do positive fixer", "do negative fixer", ... ]
(0..6).each { |n| puts do_this[n] if behavior[n, 0] > t }

Tin Man が指摘しているように、配列を直接使用できます。

do_this.each_with_index { |s, n| puts s if behavior[n, 0] }

等。

于 2012-08-08T17:29:00.997 に答える