Forum: Ruby Use methods from a library in my own class

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
A74096209c78118ff69d50a51129d697?d=identicon&s=25 Jason Lillywhite (jlillywh)
on 2009-06-04 20:27
I want to create a class that uses the RubyGnuplot library that can
create a plot using one simple command and only add options if so
desired. Below is what I have done so far and I was wondering if someone
could provide some opinion on my approach. I ran into a problem where I
allow the user to add 3 options but what I really want is access to all
the library's methods so colors and lineweights, etc can be changed if
so desired. Is there a better approach than using a hash input like I'm
doing? Thank you!

#For simple 2D line plots. File is called 'my_plotter.rb'

require 'gnuplot'
class Data2d
  def self.plot(x, y, options={})
    Gnuplot.open do |gp|
      Gnuplot::Plot.new( gp ) do |plot|

  plot.title  "#{options[:title]}"
  plot.ylabel "#{options[:y_label]}"
  plot.xlabel "#{options[:x_label]}"

  plot.data << Gnuplot::DataSet.new( [x, y] ) do |ds|
    ds.with = "lines"
  end
      end
    end
  end
end

#Now all users need to do is create the data,

require 'my_plotter'

x = [1,2,3,4,5]
y = [5,6,3,8,9]

#then run the command,

Data2d.plot(x,y)

#or, with options,

Data2d.plot(x,y,:x_label=>"Time",:y_label=>"Values", :title=>"My First
Plot")
47b1910084592eb77a032bc7d8d1a84e?d=identicon&s=25 Joel VanderWerf (Guest)
on 2009-06-04 20:40
(Received via mailing list)
Jason Lillywhite wrote:
>
> require 'gnuplot'
> class Data2d
>   def self.plot(x, y, options={})
>     Gnuplot.open do |gp|
>       Gnuplot::Plot.new( gp ) do |plot|
>
>   plot.title  "#{options[:title]}"
>   plot.ylabel "#{options[:y_label]}"
>   plot.xlabel "#{options[:x_label]}"

Untested...

     options.each {|opt,val| plot.send opt, val}
A74096209c78118ff69d50a51129d697?d=identicon&s=25 Jason Lillywhite (jlillywh)
on 2009-06-04 21:44
>
>      options.each {|opt,val| plot.send opt, val}

Thank you. That is a great idea and it works!

2 questions:

1. I see that your send method on plot.send is a method from
Gnuplot::Plot.new but what exactly is it doing? My guess is it takes
'val' and sends it to the plot method that corresponds with 'opt' as it
iterates through my hash.

2. How do I apply your idea to methods within an embedded array block
such as "plot.data" from my code:

  plot.data << Gnuplot::DataSet.new( [x, y] ) do |ds|
    ds.with = "lines"
  end

which has methods such as ds.linewidth, ds.title, etc? I tried multiple
things like creating 2 hashes but can't get my hash values to pass into
the embedded array. Thank you!
47b1910084592eb77a032bc7d8d1a84e?d=identicon&s=25 Joel VanderWerf (Guest)
on 2009-06-04 21:55
(Received via mailing list)
Jason Lillywhite wrote:
> 1. I see that your send method on plot.send is a method from
> Gnuplot::Plot.new but what exactly is it doing? My guess is it takes
> 'val' and sends it to the plot method that corresponds with 'opt' as it
> iterates through my hash.

The #send method is common to all ruby objects:

------------------------------------------------------------ Object#send
      obj.send(symbol [, args...])        => obj
      obj.__send__(symbol [, args...])    => obj

      From Ruby 1.8
------------------------------------------------------------------------
      Invokes the method identified by symbol, passing it any arguments
      specified. You can use __send__ if the name send clashes with an
      existing method in obj.

         class Klass
           def hello(*args)
             "Hello " + args.join(' ')
           end
         end
         k = Klass.new
         k.send :hello, "gentle", "readers"   #=> "Hello gentle readers"
47b1910084592eb77a032bc7d8d1a84e?d=identicon&s=25 Joel VanderWerf (Guest)
on 2009-06-04 21:57
(Received via mailing list)
Jason Lillywhite wrote:
> 2. How do I apply your idea to methods within an embedded array block
> such as "plot.data" from my code:
>
>   plot.data << Gnuplot::DataSet.new( [x, y] ) do |ds|
>     ds.with = "lines"
>   end
>
> which has methods such as ds.linewidth, ds.title, etc? I tried multiple
> things like creating 2 hashes but can't get my hash values to pass into
> the embedded array. Thank you!

Something like this?

require 'gnuplot'
class Data2d
   def self.plot(x, y, options={})
     Gnuplot.open do |gp|
       Gnuplot::Plot.new( gp ) do |plot|
         options.each {|opt,val| plot.send opt, val}
         ds_options = options[:ds]
         plot.data << Gnuplot::DataSet.new( [x, y] ) do |ds|
           ds_options.each {|opt,val| ds.send opt, val}
         end
       end
     end
   end
end

Data2d.plot(x,y,:x_label=>"Time",:y_label=>"Values", :title=>"My First
Plot", :ds => {:with => "lines"})
This topic is locked and can not be replied to.