1

我之前用 Basic 和 Pascal 编写了下面的程序,现在我将它移植到 Ruby。第 20..26 行中的 puts 代表在基本和帕斯卡中对子例程 (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 回答