ruby syntactic sugar: dealing with nils

前端 未结 6 1801
天命终不由人
天命终不由人 2021-02-10 02:45

probably asked already but I couldn\'t find it.. here are 2 common situation (for me while programming rails..) that are frustrating to write in ruby:

\"a string         


        
相关标签:
6条回答
  • 2021-02-10 02:59
    "a string".match(/foo(bar)/).to_a[1]
    

    NilClass#to_a returns an empty array, and indexing outside of it gives you nil values.

    Alternatively (what I do) you can splat the matches:

    _, some, more = "a string".match(/foo(bar)(jim)/).to_a
    
    0 讨论(0)
  • 2021-02-10 03:00

    In Ruby on Rails you have the try method available on any Object. According to the API:

    Invokes the method identified by the symbol method, passing it any arguments and/or the block specified, just like the regular Ruby Object#send does.

    Unlike that method however, a NoMethodError exception will not be raised and nil will be returned instead, if the receiving object is a nil object or NilClass.

    So for the first question you can do this:

    "a string".match(/abc(.+)abc/).try(:[], 1)
    

    And it will either give you [1] or nil without error.

    0 讨论(0)
  • 2021-02-10 03:03

    For the first I'd recommend ick's maybe (equivalent to andand)

    "a string".match(/abc(.+)abc/).maybe[1]
    

    I am not sure I understand the second one, you want this?

    var = something.very.long.and.tedious.to.write || something.other
    
    0 讨论(0)
  • 2021-02-10 03:09

    For the first question, I think Bob's answer is good.

    For the second question,

    var = something.very.long.and.tedious.to.write.instance_eval{nil? ? something.other : self}
    
    0 讨论(0)
  • 2021-02-10 03:19

    Forget that Python atavism!

    "a string"[/abc(.+)abc/,1] # => nil
    
    0 讨论(0)
  • 2021-02-10 03:19
    "a string"[/abc(.+)abc/, 1]
    # => nil
    "abc123abc"[/abc(.+)abc/, 1]
    # => "123"
    

    And:

    var = something.very.long.and.tedious.to.write || something.other
    

    Please note that or has a different operator precedence than || and || should be preferred for this kind of usage. The or operator is for flow control usage, such as ARGV[0] or abort('Missing parameter').

    0 讨论(0)
提交回复
热议问题