News for hackers. Stuff that matters.
Re:From Rails to Clojure, Then to Java, Then Back to Rails by pavlov on Wednesday March 21, 2018 @06:50PM (#16643184)

  *> 10.seconds.from_now*
I don't understand this kind of weird "urban sprawl OOP" where classes are extended with anything.

Why is 'seconds' a method on numbers? Is there also a 'pixels' method so that I could draw a line like this:

  10.pixels.from.top_left_corner.to.southeast.using.red.stroke
If this doesn't seem like a sensible way of programming graphics, why does the 10.seconds thing get a pass?
Re:From Rails to Clojure, Then to Java, Then Back to Rails by tinco on Wednesday March 21, 2018 @10:28PM (#16645098)
It's not just 'anything' that objects are extended with in Ruby, they are extended with suitable methods pertaining to the domain at hand. 'seconds' is a conversion method of one type into another. You might as well ask why do objects have a 'toString' method. Because it is convenient.
Re:From Rails to Clojure, Then to Java, Then Back to Rails by pavlov on Thursday March 22, 2018 @05:26AM (#16647097)
Why does one conversion method have the “to” prefix and the other doesn’t? I guess because the inconsistency looks somehow prettier.

But this is what drives me up the wall with the Ruby ecosystem: seems that whenever API designers had the choice between consistency and fun gimmick, they chose the latter. It makes some people feel happy, but often makes the next person who has to read and maintain the code miserable.

Re:From Rails to Clojure, Then to Java, Then Back to Rails by jashmatthews on Thursday March 22, 2018 @07:47AM (#16647736)
10.seconds is not part of the Ruby stdlib. It's Rails ActiveSupport. That's why it's different.
Re:From Rails to Clojure, Then to Java, Then Back to Rails by kureikain on Thursday March 22, 2018 @02:29AM (#16646256)
Thank you for explaining this.
Re:From Rails to Clojure, Then to Java, Then Back to Rails by kureikain on Thursday March 22, 2018 @02:29AM (#16646253)
If you think about it, that's just fluent API. And it's up to your to use it to design thing that's convenience and readable for you. When you design an API, you put it to the context. When in context:

10.seconds.from_now

is beautiful to me.

Let's do a quick google for "Fluent API in Java" and you will get something like this:

Invoice inv = Invoice.builder() .createdOn(new Date()) .withDocumentNumber("5150") .shippingOnTrailer("2112") .suppliedBy(InvoiceActor.builder() .named("101") .as(InvoiceActorType.DC) .build()) .beingSentTo(InvoiceActor.builder() .named("42") .as(InvoiceActorType.STORE) .build()) .with(InvoiceItem.builder() .as("TK421") .orderedQuantity(10) .shippedQuantity(8) .build()) .with(InvoiceItem.builder() .as("FN2187") .orderedQuantity(5) .shippedQuantity(5) .build()) .build();

The only difference here is that Ruby allow you to attach method to anything.

But then you have category in Objective C, extension in Swift/Kotlin.

The language gives you the tool, to make your job easier, that's why I wrote "I feel happy when writing Ruby" because I have that power.

To even protected you from changing everything, you can also use refinement to scope this, though it seems underestimated currently IMHO.

When using it the right way, it helps everyone write readable code.

Back to your example:

> 10.pixels.from.top_left_corner.to.southeast.using.red.stroke

It's up to your however you want to design it.