Combinatory method like tap, but able to return a different value?

前端 未结 5 1712
时光取名叫无心
时光取名叫无心 2020-12-24 06:00

I\'m going through a phase of trying to avoid temporary variables and over-use of conditional where I can use a more fluid style of coding. I\'ve taken a great liking to us

相关标签:
5条回答
  • 2020-12-24 06:39

    instance_eval can be misused for this purpose

    "this".instance_eval { |test| test + " works" }

    since 2.5 it is possible to use yield_self

    "easy".yield_self{ |a| a + " peasy" }

    Read more:

    https://ruby-doc.org/core-1.9.3/BasicObject.html#method-i-instance_eval

    https://ruby-doc.org/core-2.5.0/Object.html#method-i-yield_self

    0 讨论(0)
  • 2020-12-24 06:43

    I needed to do something like this and I like tokland's answer, but I didn't want to pollute Object for the small script I was writing. Instead, I made use of tap on an array:

    [something_complicated].tap { |s| s[0] = new_cool_thing)}.first
    
    0 讨论(0)
  • 2020-12-24 07:00

    Define Object#as:

    class Object
      def as
        yield self
      end
    end
    

    And now you can write:

    def not_sure_this_is_nice_enough_method1
      something_complex(a, b, c).as do |obj| 
        a_predicate_check? ? obj.one_more_method_call : obj
      end
    end
    
    0 讨论(0)
  • 2020-12-24 07:02
    def best_nice_method
      something_complex(a, b, c).tap |obj|
        break obj.one_more_method_call if a_predicate_check?
      end
    end
    

    The magic is break in tap returns another value.

    new

    ruby 2.5 has yield_self which exactly you want. https://stackoverflow.com/a/47890832/683157

    0 讨论(0)
  • 2020-12-24 07:04

    I found a method in the Facets gem that might be what you were looking for: Kernel#ergo

    So your original method:

    def not_nice_method
      obj = something_complex(a, b, c)
      if a_predicate_check?
        obj.one_more_method_call
      else
        obj
      end
    end
    

    might end up looking something like this:

    require 'facets/kernel/ergo'
    
    def nice_method
      something_complex(a, b, c).ergo do |_| 
        a_predicate_check? ? _.one_more_method_call : _
      end
    end
    
    0 讨论(0)
提交回复
热议问题