ruby operator overloading question

后端 未结 2 1596
逝去的感伤
逝去的感伤 2021-02-05 16:52

i\'ve been messing around with ruby and opengl for entertainment purposes, and i decided to write some 3d vector/plane/etc classes to pretty up some of the math.

simplif

相关标签:
2条回答
  • 2021-02-05 17:24

    I believe the following will do what you want, though banister's suggestion to use coerce instead of monkey-patching Numeric is a preferred method. Use this method only if necessary (for example if you only want some binary operands to be transitive).

    Fixnum.class_eval do
      original_times = instance_method(:*)
      define_method(:*) do |other|
        if other.kind_of?(Vec3)
          return other * self
        else
          return original_times.bind(self).call(other)
        end
      end
    end
    
    0 讨论(0)
  • 2021-02-05 17:30

    Using coerce is a MUCH better approach than monkey-patching a core class:

    class Vec3
        attr_accessor :x,:y,:z
    
        def *(a)
            if a.is_a?(Numeric) #multiply by scalar
                return Vec3.new(@x*a, @y*a, @z*a)
            elsif a.is_a?(Vec3) #dot product
                return @x*a.x + @y*a.y + @z*a.z
            end
        end
    
        def coerce(other)
            return self, other
        end
    end
    

    if you define v as v = Vec3.new then the following will work: v * 5 and 5 * v The first element returned by coerce (self) becomes the new receiver for the operation, and the second element (other) becomes the parameter, so 5 * v is exactly equivalent to v * 5

    0 讨论(0)
提交回复
热议问题