Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何从初始化方法调用类方法?_Ruby_Class_Matrix_Object Initializers - Fatal编程技术网

Ruby 如何从初始化方法调用类方法?

Ruby 如何从初始化方法调用类方法?,ruby,class,matrix,object-initializers,Ruby,Class,Matrix,Object Initializers,我试图在类的初始化方法期间调用该类中的方法。这是不允许的吗?我最初在类之外有一个方法来尝试将其用作全局方法。当前方法尝试返回创建的矩阵,然后initialize方法将返回的矩阵保存到实例变量中 class Member def setMatrix(a, i, l) puts "here" m = Matrix.zero(6) m[0,0] = a*l**2/i m[0,3] = -a*l**2/i m[1,1] = 12 m[1,2] = 6*

我试图在类的初始化方法期间调用该类中的方法。这是不允许的吗?我最初在类之外有一个方法来尝试将其用作全局方法。当前方法尝试返回创建的矩阵,然后initialize方法将返回的矩阵保存到实例变量中

class Member
  def setMatrix(a, i, l)
    puts "here"
    m = Matrix.zero(6)
    m[0,0] = a*l**2/i
    m[0,3] = -a*l**2/i
    m[1,1] = 12
    m[1,2] = 6*l
    m[1,4] = -12
    m[1,5] = 6*l
    m[2,1] = 6*l
    m[2,2] = 4*l**2
    m[2,4] = -6*l
    m[2,5] = 2*l**2
    m[3,0] = -a*l**2/i
    m[3,3] = a*l**2/i
    m[4,1] = -12
    m[4,2] = -6*l
    m[4,4] = 12
    m[4,5] = -6*l
    m[5,1] = 6*l
    m[5,2] = 2*l**2
    m[5,4] = -6*l
    m[5,5] = 4*l**2
    return m
    #@k = m
   end

   def initialize(a, i, l)
     @area = a
     @i = i
     @length = l
     @k = setMatrix(a, i, l)
    end
end
执行此操作将返回此错误

`'setMatrix': private method '[]=' called for #<Matrix:0x00000001186e00> (NoMethodError)
from truss_solver.rb:71:in 'initialize'
from truss_solver.rb:86:in 'new'
from truss_solver.rb:86:in 'block in <main>'
from truss_solver.rb:85:in 'each'
from truss_solver.rb:85:in '<main>'`

我希望它在实例化类时生成矩阵的实例变量。我还尝试使用setMatrix方法将矩阵直接保存到@k,而不是返回矩阵,这会产生类似的错误。我还能做些什么来实现我想要的?

没有什么可以阻止您在initialize中调用方法,其中没有特殊行为,但是您在这里调用的是另一个类中的私有方法

我不知道为什么它被设置为私人的,一些人已经观察到,所以你总是可以用暴力来强迫它:

matrix.send(:[]=, 1, 2, 3)
这看起来很混乱,按照那篇文章中的建议进行修补可能有助于简化事情:

class Matrix
  def []=(row, column, value)
    @rows[row][column] = value
  end
end
您还可以将矩阵子类化为可变矩阵,并包含该方法


值得注意的是,Ruby的方法命名约定是下划线_风格的,并且在末尾包含显式返回不是必需的,这是隐含的。只有我一个人可以完成这项工作。

没有什么可以阻止您在initialize中调用方法,那里没有特殊的行为,但是您在这里调用的是另一个类中的私有方法

我不知道为什么它被设置为私人的,一些人已经观察到,所以你总是可以用暴力来强迫它:

matrix.send(:[]=, 1, 2, 3)
这看起来很混乱,按照那篇文章中的建议进行修补可能有助于简化事情:

class Matrix
  def []=(row, column, value)
    @rows[row][column] = value
  end
end
您还可以将矩阵子类化为可变矩阵,并包含该方法


值得注意的是,Ruby的方法命名约定是下划线_风格的,并且在末尾包含显式返回不是必需的,这是隐含的。只有我一个人做这项工作。

让我们了解更多信息:

require 'matrix'
Matrix.instance_methods.include?(:[]=)
  #=> false
Matrix.private_instance_methods.include?(:[]=)
  #=> true
后者对我来说是一个惊喜。考虑到矩阵对象是不可变的,不应该有:[]=方法。它类似于2=4,这当然会引发一个异常。也许Ruby使用它来实现矩阵方法。读者能否解释为什么存在这种未记录的私有方法

如果您希望使用该私有实例方法,可以按照@tadman的建议执行

我的建议是使用。我将setMatrix重命名为set_matrix,以符合Ruby命名方法和变量的约定

class Member
  def set_matrix(a, i, l)
    Matrix.build(6) do |r,c|
      case [r,c].sort
      when [0,0], [3,3] then a*l**2/i
      when [0,3]        then -a*l**2/i
      when [1,1], [4,4] then 12
      when [1,4]        then -12
      when [1,2], [1,5] then 6*l
      when [2,4], [4,5] then -6*l
      when [2,2], [5,5] then 4*l**2
      when [2,5]        then 2*l**2
      else              0
      end
    end
  end

  def initialize(a, i, l)
    @area = a
    @i = i
    @length = l
    @k = set_matrix(a, i, l)
  end
end

让我们了解更多信息:

require 'matrix'
Matrix.instance_methods.include?(:[]=)
  #=> false
Matrix.private_instance_methods.include?(:[]=)
  #=> true
后者对我来说是一个惊喜。考虑到矩阵对象是不可变的,不应该有:[]=方法。它类似于2=4,这当然会引发一个异常。也许Ruby使用它来实现矩阵方法。读者能否解释为什么存在这种未记录的私有方法

如果您希望使用该私有实例方法,可以按照@tadman的建议执行

我的建议是使用。我将setMatrix重命名为set_matrix,以符合Ruby命名方法和变量的约定

class Member
  def set_matrix(a, i, l)
    Matrix.build(6) do |r,c|
      case [r,c].sort
      when [0,0], [3,3] then a*l**2/i
      when [0,3]        then -a*l**2/i
      when [1,1], [4,4] then 12
      when [1,4]        then -12
      when [1,2], [1,5] then 6*l
      when [2,4], [4,5] then -6*l
      when [2,2], [5,5] then 4*l**2
      when [2,5]        then 2*l**2
      else              0
      end
    end
  end

  def initialize(a, i, l)
    @area = a
    @i = i
    @length = l
    @k = set_matrix(a, i, l)
  end
end

你说过这样做会返回这个错误。。。这可能包括创建成员实例,例如,Member.new1,2,3,未显示。您说过这样做会返回此错误。。。这可能包括创建未显示的成员实例,例如Member.new1,2,3。此外,如果row>=row|u count | column>=column_count,则应引发ArgumentError,以确保行和列在矩阵内。此外,如果行>=row_count | | column>=column_count,则应引发ArgumentError,以确保行和列都在矩阵中。确实令人惊讶。类中既不使用[]=,也不使用其别名set\u元素和set\u组件。矩阵是对称的,因此您可以使用case[r,c].sort从When中删除一些冗余的r、c/c、r对。我也会使用更紧凑的当。。。那么这个例子中的形式是什么呢?@Stefan,我没有注意到它是对称的。我采纳了你聪明的建议。谢谢你能解释一下在Matrix.instance_method:[]=>中未绑定的原因吗?考虑到没有必要将该方法绑定到Matrix对象?它未绑定只是因为你没有实例。实例_方法:upcase返回未绑定的方法,而'foo'。方法:upcase返回绑定的方法。确实令人惊讶。类中既不使用[]=,也不使用其别名set\u元素和set\u组件。矩阵是对称的,因此您可以使用case[r,c].sort从When中删除一些冗余的r、c/c、r对。我也会使用更紧凑的当。。。那么这个例子中的形式是什么呢?@Stefan,我没有注意到它是对称的。我采纳了你聪明的建议。谢谢你能解释一下在Matrix.instance_method:[]=>中未绑定的原因吗?考虑到没有必要将该方法绑定到Matrix对象?它未绑定只是因为你没有实例。实例_方法:upcase返回未绑定的方法,而'foo' .method:upcase返回一个绑定方法。