"||" equivalent for .blank?

Hi all

Is there an equivalent to the || thing?

var = nil || “blah”

=> “blah”

var = “” || “blah”

=> “”

I want something like that:

var = nil ||| “blah”

=> “blah”

var = “” ||| “blah”

=> “blah”

Is there something like that in Rails? :slight_smile:

Thanks
Josh

To my knowledge, there is not.

var = “blah” if var.blank?

will however do what you want

On Thu, Aug 28, 2008 at 12:12 AM, Joshua M.
[email protected] wrote:

var = nil ||| “blah”

=> “blah”

var = “” ||| “blah”

=> “blah”

This is logically equivalent, though not as pretty

var = a.blank? ? b : a

On Thu, Aug 28, 2008 at 12:32 AM, Joshua M.
[email protected] wrote:

Thanks. But isn’t there a way to extend ruby so it can handle “|||”?

In Ruby some “operators” are syntactic sugar for methods, for example
“<<”, or “+”. But there’s no way to go in the other direction. That
is, you cannot define a method in Object named “|||” and tell Ruby it
should be parsed as an operator of such and such arity, etc.

Xavier N. wrote:

On Thu, Aug 28, 2008 at 12:12 AM, Joshua M.
[email protected] wrote:

var = nil ||| “blah”

=> “blah”

var = “” ||| “blah”

=> “blah”

This is logically equivalent, though not as pretty

var = a.blank? ? b : a

Thanks. But isn’t there a way to extend ruby so it can handle “|||”?

Xavier N. wrote:

On Thu, Aug 28, 2008 at 12:32 AM, Joshua M.
[email protected] wrote:

Thanks. But isn’t there a way to extend ruby so it can handle “|||”?

In Ruby some “operators” are syntactic sugar for methods, for example
“<<”, or “+”. But there’s no way to go in the other direction. That
is, you cannot define a method in Object named “|||” and tell Ruby it
should be parsed as an operator of such and such arity, etc.

What a pitty… Thanks though!

On Thu, Aug 28, 2008 at 12:57 AM, Joshua M.
[email protected] wrote:

What a pitty… Thanks though!

Of course if a method is good for you this is doable

class Object
  def bor(other)
    blank? ? other : self
  end
end

nil.bor("blah")          # => "blah"
''.bor({}).bor("blah")   # => "blah"
[].bor("blah").bor(true) # => "blah"

Thanks guys, I just found the blank? method. :slight_smile:

On Aug 27, 2008, at 6:12 PM, Joshua M. wrote:

I want something like that:
Josh
Like the Numeric#nonzero? that is useful in chained comparisons, you
can define nonblank? to be similar and get this effect:

class String

Allowing a chain like: string_value.nonblank? || ‘default value’

def nonblank?
self unless blank?
end
end

class NilClass

Allowing a chain like: value.nonblank? || ‘default value’

def nonblank?
self
end

so it plays nicely with Numeric#nonzero?

def nonzero?
self
end
end

Since you’re already Rails, you’re already ActiveSupport and blank?
will be well defined.

irb> nil.nonblank? || “blah”
=> “blah”
irb> “”.nonblank? || “blah”
=> “blah”
irb> “foo”.nonblank? || “blah”
=> “foo”

-Rob

Rob B. http://agileconsultingllc.com
[email protected]

In Rails you can now do this:

params[:state].presence || params[:country].presence || ‘US’

http://apidock.com/rails/Object/presence