Robert Klemme
11/7/2007 12:44:00 PM
2007/11/7, Rob Biedenharn <Rob@agileconsultingllc.com>:
> On Nov 6, 2007, at 9:25 PM, Todd Benson wrote:
> > On 11/6/07, Todd Benson <caduceass@gmail.com> wrote:
> >> On 11/6/07, yermej <yermej@gmail.com> wrote:
> >>> On Nov 6, 6:41 pm, Joshua Muheim <fo...@josh.ch> wrote:
> >>>> Hi all
> >>>>
> >>>> irb(main):001:0> "" || "asdf"
> >>>> => ""
> >>>> irb(main):002:0> nil || "asdf"
> >>>> => "asdf"
> >>>> irb(main):003:0>
> >>>>
> >>>> I'd like the first one to also return "asdf". So is there an
> >>>> operator
> >>>> that fits my needs? :-)
> >>>
> >>> "" isn't false so || and or won't work. You'll have to code it
> >>> differently. E.g.:
> >>>
> >>> a = "a string"
> >>> a || (a.empty? ? "asdf" : a)
> >>
> >> This doesn't work for me. The previous one doesn't either. This one
> >> does (I'm sure someone could easily clean this up, I feel lazy
> >> though)...
> >>
> >> [nil, "", "something"].each do |i|
> >> puts( (item ||= "").empty? ? "asdf" : item )
> >
> > There should be an additional closing ) on the previous line of code
> >
> >> end
> >
> > Todd
>
>
> I use these extensions in several projects for exactly the same reason
> as the OP
>
> 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
>
> irb(main):018:0> "".nonblank? || "asdf"
> NoMethodError: undefined method `blank?' for "":String
> from (irb):4:in `nonblank?'
> from (irb):18
>
> Ok, so these are typically Rails projects, but you can take the
> String#blank? extension from ActiveSupport
>
> irb(main):019:0> class String #:nodoc:
> irb(main):020:1> def blank?
> irb(main):021:2> empty? || strip.empty?
> irb(main):022:2> end
> irb(main):023:1> end
> => nil
> irb(main):024:0>
>
> And then Joshua's orignal examples become:
>
> irb(main):025:0* "".nonblank? || "asdf"
> => "asdf"
> irb(main):026:0> nil.nonblank? || "asdf"
> => "asdf"
>
> And for completeness:
>
> irb(main):027:0> "jkl;".nonblank? || "asdf"
> => "jkl;"
Why not simply define a global method?
def substitute_default(s, fallback)
s.nil? || s == "" ? fallback : s
end
The name of course is just a suggestion.
Kind regards
robert
--
use.inject do |as, often| as.you_can - without end