• zero_gravitas@aussie.zone
    link
    fedilink
    English
    arrow-up
    49
    ·
    edit-2
    11 months ago

    Ruby:

    a || b

    (no return as last line is returned implicitly, no semicolon)

    EDIT: As pointed out in the comments, this is not strictly equivalent, as it will return b if a is false as well as if it’s nil (these are the only two falsy values in Ruby).

    • stebo02
      link
      fedilink
      arrow-up
      23
      arrow-down
      1
      ·
      11 months ago

      Python:

      return a or b

      i like it because it reads like a sentence so it somewhat makes sense

      and you can make it more comprehensive if you want to:

      return a if a is not None else b

      • Turun@feddit.de
        link
        fedilink
        arrow-up
        15
        ·
        edit-2
        11 months ago

        This diverges from the OP code snippets if a has the value False.

      • alehc@lemmy.world
        link
        fedilink
        arrow-up
        8
        arrow-down
        1
        ·
        11 months ago

        I personally dislike this because when you read “or” you expect some boolean result not a random object :/

        • stebo02
          link
          fedilink
          arrow-up
          4
          ·
          11 months ago

          there’s always the second option for you

      • rwhitisissle@lemmy.ml
        link
        fedilink
        arrow-up
        2
        arrow-down
        1
        ·
        11 months ago

        For newer python people, they see return a or b and typically think it returns a boolean if either is True. Nope. Returns a if a is truthy and then checks if b is truthy. If neither are truthy, it returns b.

        • Arthur Besse@lemmy.ml
          link
          fedilink
          arrow-up
          7
          ·
          edit-2
          11 months ago

          Returns a if a is truthy and then checks if b is truthy. If neither are truthy, it returns b.

          Not quite. If a is not truthy, then the expression a or b will always return b.

          So, there is never any reason to check the truthiness of b.

          you can paste this in your repl to confirm it does not.
          class C:
           def __repr__(self): return [k for k, v in globals().items() if v is self][0]
           def __bool__(self):
            print(f"{self}.__bool__() was called")
            return False
          
          a, b = C(), C()
          print(f"result: {a or b}")
          
          output
          a.__bool__() was called
          result: b
          
    • palordrolap@kbin.social
      link
      fedilink
      arrow-up
      7
      ·
      edit-2
      11 months ago

      Perl has both $a || $b and $a // $b.

      The || version is older and has the value of $b if $a is any false value including undef (which is pretty much Perl’s null/nil).

      The // version has the value of $b iff $a is undef. Other “false” values carry through.

      Ruby took both “no return required” and “no final semicolon required” from Perl (if not a few other things), I think, but it seems that // was Perl later borrowing Ruby’s || semantics. Interesting.

      i.e. 0 || 1 is 1 in Perl but 0 in Ruby. Perl can 0 // 1 instead if the 0, which is a defined value, needs to pass through.