I have some problems understanding the basics of classes and modules in
Ruby – and arg and options. How do you create a e g class that can take
some options, but leave them out if not needed? This is what I’m
familiar with now, sending along an arg to the method in a module.
module Abc
def self.test(arg)
puts arg
end
end
In this occasion I have to pass along a an arg, or nil, or there will an
error. But how do I design my module so I can pass options, or leave
them out if wanted? Like:
Abc.test(:color => ‘red’) or Abc.test()
Try this:
module Abc
def self.test(arg => :red)
puts arg
end
end
puts Abc.test # => red
puts Abc.test(:blue) #=> blue
On Oct 13, 9:41am, Paul B. [email protected] wrote:
In this occasion I have to pass along a an arg, or nil, or there will an
error. But how do I design my module so I can pass options, or leave
them out if wanted? Like:
Abc.test(:color => ‘red’) or Abc.test()
Simply:
class Abc
def initialize(opts={})
@color = opts[:color]
end
end
But I usually do:
class Abc
attr_accessor :color
def initialize(opts={})
opts.each do |k,v|
send(“#{k}=”, v)
end
end
end
Also, if you want args and opts,
def initialize(*args)
opts = (Hash === args.last ? args.pop : {})
...
On 10/13/2010 8:59 AM, Intransition wrote:
Also, if you want args and opts,
def initialize(*args)
opts = (Hash === args.last ? args.pop : {})
...
And if you want a specific list of arguments followed by options:
def initialize(arg1, arg2, opts = {})
…
end
-Jeremy
Thomas S. wrote in post #949846:
Simply:
class Abc
def initialize(opts={})
@color = opts[:color]
end
end
But I usually do:
class Abc
attr_accessor :color
def initialize(opts={})
opts.each do |k,v|
send("#{k}=", v)
end
end
end
Also, if you want args and opts,
def initialize(*args)
There it is. Thanks 
opts = (Hash === args.last ? args.pop : {})
...
On 10/13/2010 9:16 AM, Paul B. wrote:
What about being able to pass different values to :color, like :color =>
'red or :color => ‘blue’? How do I deal with that inside the module?
module Abc
def self.test(opts = {})
puts opts[:color]
end
end
Abc.test(:color => ‘red’) # => red
Abc.test(:color => ‘blue’) # => blue
What if I would like to pass several values, with some set with a
default value if not declared?
What about being able to pass different values to :color, like :color =>
'red or :color => ‘blue’? How do I deal with that inside the module?
On 10/15/2010 9:18 AM, Paul B. wrote:
What if I would like to pass several values, with some set with a
default value if not declared?
module Abc
def self.test(opts = {})
default_opts = {
:color => ‘yellow’,
:size => ‘small’
}
opts = default_opts.merge(opts)
puts "color = #{opts[:color]}, size = #{opts[:size]}"
end
end
Abc.test
=> color = yellow, size = small
Abc.test(:color => ‘red’)
=> color = red, size = small
Abc.test(:size => ‘large’)
=> color = yellow, size = large
Abc.test(:color => ‘blue’, :size => ‘humongous’)
=> color = blue, size = humongous
-Jeremy
On Wed, Oct 13, 2010 at 3:46 PM, Andrew W. [email protected]
wrote:
Try this:
module Abc
def self.test(arg => :red)
puts arg
end
end
puts Abc.test # => red
puts Abc.test(:blue) #=> blue
The above should be ‘=’, not ‘=>’. Like this:
irb(main):010:0> module Abc
irb(main):011:1> def self.test(color = :red)
irb(main):012:2> puts color
irb(main):013:2> end
irb(main):014:1> end
=> nil
irb(main):015:0> Abc.test
red
=> nil
irb(main):016:0> Abc.test(:blue)
blue
=> nil
As you mentioned “options”, it seems that you might want to allow
passing several options, not just one argument. The usual idiom for
that is using a hash:
irb(main):017:0> module Abc
irb(main):018:1> def self.test(options = {})
irb(main):019:2> color = options[:color] || :red
irb(main):020:2> size = options[:size] || 3
irb(main):021:2> puts color,size
irb(main):022:2> end
irb(main):023:1> end
=> nil
irb(main):024:0> Abc.test
red
3
=> nil
irb(main):025:0> Abc.test(:color => :blue)
blue
3
=> nil
irb(main):027:0> Abc.test(:color => :blue, :size => 5)
blue
5
=> nil
You could also have the default values in the default argument:
def self.test(options = {:color => :red, :size => 3})
or like this:
def self.test(options = {})
options = {:color => :red, :size => 3}.merge(options)
end
Jesus.
On Wed, Oct 13, 2010 at 4:16 PM, Paul B. [email protected]
wrote:
What about being able to pass different values to :color, like :color =>
'red or :color => ‘blue’? How do I deal with that inside the module?
You want to pass several colors in one go? Use an array as the value:
irb(main):028:0> module Abc
irb(main):029:1> def self.test(options = {})
irb(main):030:2> colors = options[:colors] || [:red]
irb(main):031:2> puts “The chosen colors are: #{colors.inspect}”
irb(main):032:2> end
irb(main):033:1> end
=> nil
irb(main):034:0> Abc.test(:colors => [:red, :green, :blue])
The chosen colors are: [:red, :green, :blue]
Jesus.