True method_alias


#1

Crystal Wiki[1] says an alternative to Ruby alias_method is using previous_def. From what I can see, this doesn’t do much, compared to Ruby style. I’ve used and seen alias_method both in libraries (for deprecation support), and also in application types for execution of previous method definition (in specific cases, ie. shorthands).

Using alias_method is pretty simple in Ruby[2]. Just alias to previous definition, similar to what Crystal offers (ie. in inheritance).

Playground: https://repl.it/repls/SpitefulUnevenGuiltware

class User

  def full_name
    puts "Nur Yubr"
  end

  # Using `alias_method` to run previous declar
  alias_method :name, :full_name
end

User.new.name 

Using perf_def overwrites previous method declaration, as per the Wiki. This works well if inheritance is in use. But otherwise, we can’t alias to previous method definition.

Playground: https://play.crystal-lang.org/#/r/6btf

class User

  def full_name
    puts "Nur Yubr"
  end

  # doesn't make much sense to use previous_def 
  # => previous_def
  
  # `alias` is not usable in this case
  # alias name = full_name
  
  # hacky alternative 
  def name
    full_name
  end
end

User.new.name

Any points? @Sija pointed asking @r00ster91, maybe he can share some detail. Anyway, looking forward to see alternatives.


#2

The reason is that in Crystal we try to avoid aliases because they are redundant.


#3

What is the proper way to deprecate old methods while avoiding more redundant way I wrote above?


#4

You keep the old method for a version with a compile time warning. The next version you can turn that compile time warning into a compile time error. Then the next version you remove the method.


Crystal code check tool