4 ms·
I may sounds weird but Ruby is what make me look more into functional programming. I get done a lot with Ruby due to all method it has on Array/Object/Enumerabl
by kureikain 9y ago
I may sounds weird but Ruby is what make me look more into functional programming. I get done a lot with Ruby due to all method it has on Array/Object/Enumerable.
The beauty of `&` is awesome and I discover that Elixir/Clojure has that and bring it to next level. I think Ruby has inspired many other language to take that path too.
One of the thing about Ruby is that it optimize for happiness, which sound weird. But I really feel happy to write Ruby code. I feel like the language really care about me.
Who don't want to have stuff like this:
```
10.seconds.from_now
```
Or just call method without `()`, and without even wrapping hash in `{}`.
Of course, lots of these are do-able in Lisp and I like Clojure. But I think the flexibility Ruby gives us is under estimated.
- pimeys 9y agoIt looks nice, but then again: irb(main):002:0> 10.methods.count => 133 Oh well...
- kureikain 9y agoWhat's wrong with this? What is your expecation?
- pimeys 9y agoDepends of course what kind of systems you're building. Just the footprint of an integer is too large in Ruby to do anything fast. I'd expect features such as `days` to be a part of Date library that holds an interface accepting certain kind of objects giving dates back. If I don't need these features, I don't want to hold the functionality at all inside an integer.
- blackmagevivi9 9y agoExactly. Right tool for the job. Ruby doesn't give you fast. That's part of its trade-off. Want web apps and scripts? Go Ruby. Want fast? Control over everything? Go native: C/C++. But also become trench into the swamp of memory leaks, stomps, corruption. Fun times.
- pimeys 9y agoOr use Rust/Haskell/OCaml/Clojure.
- pavlov 9y ago*> 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?
- tinco 9y agoIt'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.
- kureikain 9y agoThank you for explaining this.
- pavlov 9y agoWhy 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.
- jashmatthews 9y ago10.seconds is not part of the Ruby stdlib. It's Rails ActiveSupport. That's why it's different.
- kureikain 9y agoIf 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.