[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Use methods from a library in my own class

Jason

6/4/2009 6:28:00 PM

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")
--
Posted via http://www.ruby-....

4 Answers

Joel VanderWerf

6/4/2009 6:39:00 PM

0

Jason Lillywhite wrote:
> 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]}"

Untested...

options.each {|opt,val| plot.send opt, val}

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Jason

6/4/2009 7:45:00 PM

0

>
> 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!
--
Posted via http://www.ruby-....

Joel VanderWerf

6/4/2009 7:51:00 PM

0

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"


--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Joel VanderWerf

6/4/2009 7:56:00 PM

0

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"})


--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407