00:00:12.830
Hello RubyConf! How are we doing? I hope you are all doing well. Welcome to my talk, where I will discuss Ruby, the programming language.
00:00:21.960
This talk is somewhat of a spin-off from the keynote presentation about upcoming Ruby features and the challenges they bring.
00:00:30.359
While I will touch on some of the features, my focus will be from the perspective of Ruby developers, rather than that of language designers or core team members making decisions.
00:00:49.530
Today, I will talk about "Ruby Next," which is a way to make old Ruby quack like a new one. Let me give you a brief overview of what I will cover.
00:01:00.239
Imagine you have an older version of Ruby, such as Ruby 2.5, and you want to try out the shiny new pattern matching syntax. It is likely that it will not work because Ruby 2.5 does not recognize this new syntax.
00:01:28.700
So, what is Ruby Next? In the context of this example, Ruby Next simply refers to a switch in the common module, which allows older Ruby versions to understand, recognize, and correctly evaluate newer features.
00:01:55.370
Now, let’s get to the official part of my talk. My name is Vladimir, and I am originally from Russia but currently reside in New York City.
00:02:01.290
I work for a consultancy agency called Evil Martians, which has agents all over the world, from San Francisco to Pampang, and right now I’m here in Nashville.
00:02:21.640
I'm the only one here, except for the clients. Alongside client work, we also do a lot of open source projects that you may have heard about.
00:02:34.400
As a Ruby developer, I maintain several Ruby gems. While they may not all be popular, many are familiar to some of you.
00:02:44.000
This brings me to the situation that led me to be here today discussing Ruby Next.
00:03:05.090
As a library developer, I need to support multiple Ruby versions since many users may not be using the most recent version. No one wants to use a library that does not support their version of Ruby.
00:03:30.440
Currently, I am migrating all of my libraries to support at least Ruby 2.5 because Ruby 2.4 is officially dead.
00:03:45.470
However, I want to use features from Ruby 2.7. The problem is that I can’t utilize those new features because I need to maintain compatibility.
00:04:01.489
Now I want to ask a question: how many of you here are gem authors? Okay, now how many of you are application developers? It seems most of you are application developers.
00:04:23.160
Even if you develop applications, it doesn't mean you can upgrade your Ruby version right away. According to JetBrains, many Ruby developers are still using previous versions.
00:04:35.490
Many developers are hesitant to switch to a new Ruby version because the cost of upgrading can be steep. It’s not as simple as just changing the Ruby version and updating the repository.
00:05:03.539
The effort required for an upgrade is substantial, and the performance improvements are often minimal.
00:05:11.210
While every Ruby release introduces performance improvements, they are often not significant enough to compel developers to upgrade.
00:05:39.780
Furthermore, the excitement for new features should be a reason to upgrade, but until Ruby 2.7, there hadn't been that much appeal in terms of shiny new features.
00:05:57.750
Two years ago, with Ruby 2.5, a feature caught my attention: the `defined?` operator. Initially, I was skeptical about its utility, but my perspective changed once I started using it in practice.
00:06:23.629
This led me to explore ways to backport new features to older versions of Ruby without conflicting with existing methods in libraries. I turned to refinements, a safe way to extend classes and modules without risking method collisions.
00:07:09.029
Refinements are a way to monkey-patch Ruby classes in a scoped manner so that new methods are only available within specific contexts.
00:07:35.550
This method of backporting is safer compared to traditional monkey patching. So, I decided to use refinements to bring new methods to older Ruby versions without introducing conflicts.
00:08:06.869
Who here is familiar with how refinements work? They were introduced in Ruby 2.0 but were considered experimental. Many developers were apprehensive about using them due to their initial label.
00:08:43.240
However, refinements have matured over the years, and by Ruby 2.5, they became a more consistent feature that we can rely on.
00:09:00.790
Refinements allow you to create a scoped definition of methods, meaning the core method lookup behavior is adjusted lexically.
00:09:39.160
This means that the scope of any added methods is limited to where you activated that refinement.
00:10:02.620
This makes refinements a powerful tool when it comes to extending Ruby's features safely.
00:10:20.590
I decided to leverage refinements to backport new APIs to older Ruby versions.
00:10:38.240
For example, while working with Ruby 2.5, I started to integrate a collection of useful methods that existed in newer Ruby versions.
00:11:29.000
One important aspect of Ruby Next is that it enables usage of modern Ruby features in older applications seamlessly.
00:12:04.250
Next, I want to delve into the core concept of Ruby Next and how it combines universal refinements for backporting APIs along with a transpiler for new syntax features.
00:12:31.020
Transpiling is the process of compiling source code from one version to another, allowing developers to write code in the latest versions while still supporting older Ruby implementations.
00:12:49.950
An example of transpiles in action is how we translate newer Ruby syntax, like pattern matching or numbered parameters, back to older versions of Ruby.
00:13:38.130
In doing so, we parse the source code, modify the abstract syntax tree, and regenerate the corresponding Ruby code for compatibility.
00:14:17.500
We get to leverage existing libraries like 'ripper,' 'parser,' and 'ruby-ast' to assist with code transformations, offering a powerful way to maintain compatibility with new features.
00:15:00.320
As we move towards the future, Ruby Next aims to further integrate methods to support syntax that is currently experimental, while offering existing functionality to older Ruby developers.
00:15:40.370
Furthermore, ensuring that Ruby Next is compatible with the various existing Ruby frameworks remains a crucial part of the development process.
00:16:20.550
The idea is to create the next evolution of Ruby without users needing to worry about version compatibility.
00:16:37.080
Overall, the community behind Ruby Next is committed to providing thorough testing and validation for our backporting techniques.
00:17:14.890
By combining modern syntaxes and techniques, Ruby Next can help developers write cleaner code, maintain compatibility across versions, and truly leverage the best of Ruby.
00:17:49.980
In conclusion, Ruby Next is a pivotal tool that ensures old Ruby can indeed quack like a new one, enabling adaptability and providing a streamlined transition towards newer features and syntaxes.
00:18:20.490
So don’t be afraid; join the journey into Ruby Next, where modern functionalities can be used even in older implementations.
00:18:36.400
Thank you for your time, and I am open to your questions!