Node.JS
Node.JS

Reputation: 1570

very simple ruby programing, getting error and don't understand it

I'm asked to write the ruby program that generate the output based the given command,

The full description

I'm really new in ruby (maybe few hours that I have started ruby)

I'm getting this error, please check my code for other possible errors:

Thank you.

n `block in each2': undefined method `[]' for #<MyVector:0x00000002c4ad90 @array=[2, 3, 4]> (NoMethodError)

What I have done so far:

# MyVector Class
class  MyVector
  def initialize (a)
    if !(a.instance_of? Array)
      raise "ARGUMENT OF INITIALIZER MUST BE AN ARRAY"
    else
      @array = a
    end
  end

  def array
    @array
  end

  def to_s
    @array.to_s
  end

  def length
    @array.length
  end

  def each2(a)
    raise Error, "INTEGER IS NOT LIKE VECTOR" if a.kind_of?(Integer)
    Vector.Raise Error if length != a.length
    return to_enum(:each2, a) unless block_given?
    length.times do |i|
      yield @array[i], a[i]
    end
    self
  end

  def * (a)
    Vector.Raise Error if length != a.length
    p = 0
    each2(a) {|a1, a2|p += a1 * a2}
    p
  end
end

# MyMatrix Class
class MyMatrix
  def initialize a
    @array=Array.new(a.length)
    i=0
    while(i<a.length)
      @array[i]=MyVector.new(a[i])
    end
  end

  def to_s
    @array.to_s
  end

  def transpose
    size=vectors[0].length
    arr= Array.new(size)
    i=0
    while i<size
      a=Array.new(vector.length)
      j=0
      while j<a.length
        a[j]=vectors[j].arr[i]
        j+=1
      end
      arr[i]=a
      i+=1
    end
    arr[i]=a
    i+=1
  end

  def *m
    if !(m instance_of? MyMatrix)
      raise Error
      a=Array.new(@array.length)
      i=0
      while (i<@array.length)
        a[i]=@array[i]*m
        i=i+1
      end
    end
  end
end

Input:

Test code
v = MyVector.new([1,2,3])
puts "v = " + v.to_s
v1 = MyVector.new([2,3,4])
puts "v1 = " + v1.to_s
puts "v * v1 = " + (v * v1).to_s
m = MyMatrix.new([[1,2], [1, 2], [1, 2]])
puts "m = " + m.to_s + "\n"
puts "v * m = " + (v * m).to_s
m1 = MyMatrix.new([[1, 2, 3], [2, 3, 4]])
puts "m1 = " + m1.to_s + "\n"
puts "m * m1 = " + (m * m1).to_s
puts "m1 * m = " + (m1 * m).to_s

Desired Output:

v = 1 2 3
v1 = 2 3 4
v * v1 = 20
m =
1 2
1 2
1 2
v * m = 6 12
m1 =
1 2 3
2 3 4
m * m1 =
5 8 11
5 8 11
5 8 11
m1 * m =
6 12
9 18

Upvotes: 0

Views: 40

Answers (1)

Matt
Matt

Reputation: 20766

length.times do |i|
  yield @array[i], a[i]
end

In the above block, a is an instance of MyVector. You need to define the [] operator on it, probably something like:

def [](i)
  @array[i]
end

Upvotes: 1

Related Questions