矩阵的未定义方法,字符串到矩阵

时间:2014-01-23 23:18:46

标签: ruby-on-rails ruby matrix

我正在尝试使用矩阵;我的模型有一个名为“board”的属性,它只是一个4x4矩阵。我在我看来展示了这块板子。到现在为止还挺好。当我点击一个按钮时,我发送参数“board”,例如,这个结构:

{"utf8"=>"✓", "game_master"=>{"board"=>"Matrix[[0, 0, 0, 0], [0, 0, 1, 1], [0, 0, 1, 0],        [1, 1, 0, 0]]"}, "commit"=>"Yolo"}

另一方面,在控制器中,我尝试通过创建一个新的gamemaster来重新创建这个板,其中board = Matrix [[0,0,0,0],[0,0,1,1],[0 ,0,1,0],[1,1,0,0]]。到目前为止一切都那么好(不,我知道param [:board]只是一个字符串,这是我的问题)。然后,稍后,当尝试迭代矩阵时,我收到此错误:

undefined method `each_with_index' for "Matrix[[0, 0, 0, 0], [0, 0, 1, 1], [0, 0, 1, 0], [1, 1, 0, 0]]":String

显然,我绑定:登上字符串而不是矩阵。如何将该字符串转换为相应的矩阵?

由于

更新: game_masters_controller.rb

def step
@game_master = GameMaster.new(game_master_params)
 @game_master.step
 respond_to do |format|
   format.js
 end
end

private
def game_master_params
  params.require(:game_master).permit(:board)
end

game_master.rb

def initialize(attributes = {})
 attributes.each do |name, value|
   send("#{name}=", value)
 end
 if(self.board == nil)
   self.board = get_new_board
 end
end

4 个答案:

答案 0 :(得分:1)

简单地说:

arr = params[:game_master][:board].split(',').map(&:to_i).each_slice(4).to_a
# => [[0, 0, 0, 0], [0, 0, 1, 1], [0, 0, 1, 0], [0, 1, 0, 0]]

require 'matrix'
matrix = Matrix[*arr]
# => Matrix[[0, 0, 0, 0], [0, 0, 1, 1], [0, 0, 1, 0], [0, 1, 0, 0]]

答案 1 :(得分:0)

快速又脏又不安全:

class GameMaster
  ...
  def board=(attr)
    @board = eval attr
  end
end

答案 2 :(得分:0)

我会对通过表单提交的内容运行eval。如果矩阵总是4x4,我可能只会在一个长逗号分隔的字符串中提交值,如0,0,0,1,1,1,0 ...。然后我会使用String#split将大字符串转换为数组。一旦你有一个大的数组,你可以遍历它以生成一个数组,你可以发送到Matrix.new

string_params = 0,1,1,0,0,1
array_of_string = string_params.split(',')
array_of_arrays = array_of_string.each_slice(4).to_a
matrix = Matrix.new(array_of_arrays)

这应该指向正确的方向。

祝你好运!

答案 3 :(得分:0)

试试这段代码: (正如其他提到的答案,来自输入的eval代码不安全)

require 'matrix'
m = eval "Matrix[[0, 0, 0, 0], [0, 0, 1, 1], [0, 0, 1, 0], [1, 1, 0, 0]]"

=>矩阵[[0,0,0,0],[0,0,1,1],[0,0,1,0],[1,1,0,0]]

m.transpose

=>矩阵[[0,0,0,1],[0,0,0,1],[0,1,1,0],[0,1,0,0]]

要求matrix.rb文件可以访问许多有用的方法,请查看文档以获取更多信息。

http://ruby-doc.org/stdlib-2.1.0/libdoc/matrix/rdoc/Matrix.html