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.
James B. (Guest)
on 2009-04-17 22: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
>>
Gary D. (Guest)
on 2009-04-17 22:54
(Received via mailing list)
James B. 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,
James B. (Guest)
on 2009-04-17 22:55
James B. 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
Robert W. (Guest)
on 2009-04-18 05:28
James B. wrote:
> James B. 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
James B. (Guest)
on 2009-04-18 05:32
Robert W. 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.
Andrius C. (Guest)
on 2009-04-18 17: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 B. <removed_email_address@domain.invalid>
This topic is locked and can not be replied to.