$ cat -n struct_point.rb 1 Point = Struct.new(:x, :y) # Creates new class, assigns to Point 2 3 p = Point.new(1,2) # => #<struct Point x=1, y=2> 4 p p.x # => 1· 5 p p.y # => 2 6 p.x = 3 # => 3 7 p p.x # => 3 8 #--------------------------- 9 p[:x] = 7 10 p p[:x] # => 7: same as p.x 11 p p[1] # => 2: same as p.y 12 p.each {|c| print c} # prints "72" 13 puts 14 p.each_pair {|n,c| print n,c; puts } 15 puts 16 #--------------------------- 17 p = Point.new(4,2) 18 q = Point.new(4,2) 19 p q == p # => true 20 h = {q => 1} # Create a hash using q as a key 21 p h[p] # => 1: extract value using p as key 22 p q.to_s # => "#<struct Point x=4, y=2>" 23 24 require 'extending_struct_point' 25 26 puts "sorting!" 27 puts [p, q].sort
$ cat -n extending_struct_point.rb 1 class Point # Open Point class for new methods 2 def add!(other) # Define an add! method 3 self.x += other.x 4 self.y += other.y 5 self 6 end 7 8 include Comparable # Include a module for the class 9 def <=>(other) # Define the <=> operator 10 return nil unless other.instance_of? Point 11 self.x**2 + self.y**2 <=> other.x**2 + other.y**2 12 end 13 end
$ ruby -I. struct_point.rb 1 2 3 7 2 72 x7 y2 false nil "#<struct Point x=4, y=2>" sorting! #<struct Point x=4, y=2> #<struct Point x=7, y=2>
Las clases creadas por Struct son mutables. Si la queremos hacer inmutable
usamos undef
:
$ cat -n making_struct_inmutable.rb 1 Point = Struct.new(:x, :y) # Define mutable class 2 class Point # Open the class 3 undef x=,y=,[]= # Undefine mutator methods 4 end 5 6 z = Point.new(2,3) 7 8 z.x = 4
[~/point]$ ruby making_struct_inmutable.rb making_struct_inmutable.rb:8:in `<main>': undefined method `x=' for #<struct Point x=2, y=3> (NoMethodError)
Casiano Rodriguez León 2015-01-07