Forum: Ruby on Rails When is nil not false?

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.
171ea139761951336b844e708d1547ab?d=identicon&s=25 James Byrne (byrnejb)
on 2009-04-17 20:47
Can someone see what I cannot given this code?

class ForexCASource

  def initialize(source=nil)
    xchg_source unless source
    puts "this is source = #{source} #{source.class}"
    puts "do we get here? why?"
    xchg_source(source)
  end


>> fx = ForexCASource.new
this is source =  NilClass
do we get here? why?
TypeError: can't convert nil into String
        from /usr/lib/ruby/1.8/open-uri.rb:32:in
`open_uri_original_open'
        from /usr/lib/ruby/1.8/open-uri.rb:32:in `open'
        from
/home/byrnejb/Software/Development/Projects/proforma.git/app/services/forex_ca_source.rb:58:in
`xchg_source'
        from
/home/byrnejb/Software/Development/Projects/proforma.git/app/services/forex_ca_source.rb:52:in
`initialize'
        from (irb):1:in `new'
        from (irb):1
>>
1031b098def83ad718b247ea0ef2443e?d=identicon&s=25 Gary Doades (Guest)
on 2009-04-17 20:54
(Received via mailing list)
James Byrne wrote:
>
> `xchg_source'
>         from
> 
/home/byrnejb/Software/Development/Projects/proforma.git/app/services/forex_ca_source.rb:52:in
> `initialize'
>         from (irb):1:in `new'
>         from (irb):1

xchg_source unless source

This is a one-liner that just doesn't call xchg_source if source is nil
(which it is in this case).

All other lines will execute normally so:

xchg_source(source) will call xchg_source with a nil value. Since you
haven't posted the code for xchg_source it's hard to tell what's
happening in there.

did you mean:

      if !source
        puts "this is source = #{source} #{source.class}"
        puts "do we get here? why?"
        xchg_source(source)
      end

Cheers,
Gary,
171ea139761951336b844e708d1547ab?d=identicon&s=25 James Byrne (byrnejb)
on 2009-04-17 20:55
James Byrne wrote:
> Can someone see what I cannot given this code?

I need a return in front of the statement.

  def initialize(source=nil)
    return xchg_source unless source
    xchg_source(source)
  end
280b78a61a968391b7e07e912be102a8?d=identicon&s=25 Robert Walker (robert4723)
on 2009-04-18 03:28
James Byrne wrote:
> James Byrne wrote:
>> Can someone see what I cannot given this code?
>
> I need a return in front of the statement.
>
>   def initialize(source=nil)
>     return xchg_source unless source
>     xchg_source(source)
>   end

Why not just let xchg_source deal with the nil then you just have:

def initialize(source=nil)
  xchg_source(source)
end

protected # assuming this is not part of the public interface
def xchg_source(source)
  if source
    # whatever you do if source is given
  else
    # whatever should happen if source is nil
  end
end
171ea139761951336b844e708d1547ab?d=identicon&s=25 James Byrne (byrnejb)
on 2009-04-18 03:32
Robert Walker wrote:

> Why not just let xchg_source deal with the nil then you just have:
>
> def initialize(source=nil)
>   xchg_source(source)
> end
>
> protected # assuming this is not part of the public interface

Ah, but it is public and if I pass a nil object to it then it fails, but
it does not fail if I pass it nothing at all, or if I pass it a string,
or a file object, etc.  Odd, but there it is.
97f7778bd994b7e4c5ad025be0640bde?d=identicon&s=25 Andrius Chamentauskas (Guest)
on 2009-04-18 15:26
(Received via mailing list)
What about:
def initialize(source=nil)
  source ? xchg_source(source) : xchg_source
end

Or if you prefer longer notation
def initialize(source=nil)
  if source
    xchg_source(source)
  else
    xchg_source
end

Or like in your example:
def initialize(source=nil)
  return xchg_source unless source
  xchg_source(source)
end

On Apr 17, 9:47 pm, James Byrne <rails-mailing-l...@andreas-s.net>
This topic is locked and can not be replied to.