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