Remix.run Logo
Mystery-Machine 7 days ago

PHP:

        $result = $arr
            |> fn($x) => array_column($x, 'tags') // Gets an array of arrays
            |> fn($x) => array_merge(...$x)       // Flatten into one big array
            |> array_unique(...)                  // Remove duplicates
            |> array_values(...)                  // Reindex the array.
        ; // <- wtf
Ruby:

    result = arr.uniq.flatten.map(&:tags)
I understand this is not pipe operator, but just look at that character difference across these two languages.

// <- wtf

This comment was my $0.02.

Alifatisk 7 days ago | parent | next [-]

Can't the pipe operator be easily mimicked in Ruby thanks to its flexibility?

I'm thinking of something like this:

    class Object
      def |>(fn)
        fn.call(self)
      end
    end
which then can be in the following way:

    result = arr
      |> ->(a) { a.uniq }
      |> ->(a) { a.flatten }
      |> ->(a) { a.map(&:tags) }
Or if we just created an alias for then #then method:

    class Object
      alias_method :|>, :then
    end
then it can be used like in this way:

    arr
      |> :uniq.to_proc
      |> :flatten.to_proc
      |> ->(a) { a.map(&:tags) }
rafark 7 days ago | parent [-]

The great thing about this pipe operator is that it accepts any callable expression. I’m writing a library to make these array and string functions more expressive.

For example, in php 8.5 you’ll be able to do:

[1,1,2,3,2] |> unique

And then define “unique” as a constant with a callback assigned to it, roughly like:

const unique = static fn(array $array) : array => array_unique($array);

Much better.

moebrowne 7 days ago | parent | prev | next [-]

The trailing semi-colon on a new line helps prevent Git conflicts and gives cleaner diffs.

It's the same reason PHP allows trailing commas in all lists.

daneel_w 7 days ago | parent | prev | next [-]

Putting the delimiter on a line of its own is a syntactical trick that helps bringing small additions down to a neater 1-line diff instead of a 2-line diff. You've probably run into it many times before in other contexts without thinking of it. Arrays/hashes, quoted multi-line strings etc.

hu3 6 days ago | parent | prev [-]

People use Laravel Collections or similar Symfony array wrapper to achieve chaining.

Most PHP code I see look like your Ruby example.