Forgiving ruby
sometimes when you write in ruby fast enough you may miss some character, maybe miss write a character or something, i thought that there is a way we can make ruby more forgiving toward your writing mistakes
it is easy we'll monkey patch the Object class to respond to methods that doesn't exists but there is another method that is quite like it.
Gist : https://gist.github.com/11158374
#!/usr/bin/env ruby
# Author : Emad Elsaid (https://github.com/blazeeboy)
# monkey batch, yup that a bad practice,
# but lets say that this is a proof of concept
#
# we'll open the object class and handle the
# method missing situation, we'll claculate
# distance between the requested method and
# all methods available in object, then the nearest
# method if distance doesn't exceed certain number
# then execute it.
class Object
def method_missing(meth, *args, &block)
threshold = 3
all_meth = methods.sort
all_meth.sort_by! do |m|
string_distance m, meth
end
if string_distance(all_meth.first, meth) <= 3
send all_meth.first, *args, &block
else
super
end
end
# we'll calculate distance between 2 string by
# getting number of characters in 1 and not in 2
# and number chars in 2 not in 1, sum the two
# differences and return that weight
# less weight is more similar method
def string_distance(str1, str2)
one_way = str1.to_s.chars - str2.to_s.chars
the_other_way = str2.to_s.chars - str1.to_s.chars
one_way.size + the_other_way.size
end
end
# ## UseCase ?
# you can use `nil` instead of `nil?`
p "26512135".nil
# you can use `toi` and `tof` instead of `to_i` and `to_f`
p "12123".tof
# this way ruby will be more forgiving if you wrote
# method name with wrong character or less character or more
# with 1 character, when you increate the `threshold` it'll
# be more forgiving :D,
#
# happy coding.
Written by Emad Elsaid
Related protips
7 Responses
Well, I don't think that this is a good idea. IMHO developers should be warned about miss writing because ruby is forgiving too much by not forcing us to use semicolons, parentheses and so on...
that is right, the above is a only a proof of concept that this is possible not a production technique
Sounds like gigantic security vulnerability to me. :)
Good tip though! There should be a use-case for this technique.
I use Linter with Sublime and Atom. It points out programming-typo's when you type stuff. combined with Rubocop, etc. it makes a perfect way of correcting your mistakes.
I don't see this like a good idea for production code, but it looks super fun! It remembers me the autocorrection for commands in zsh and I think this could be useful for debugging:
What if you combine this idea with a call to ruby debugger, write a warning in the log or sending a report to your favourite exception notificator? If you have spent a while getting ready some kind of test that is time consuming, may be a largue test suite or trying some commands in the console, you'll be super-angry if something fails because you mistyped a 'nil?' call and you have to start over. I think it could be useful to be aware of the mistake but don't stopping the execution of your test because of this. What do you think? You can always deactivate it for production environment ;-)
it looks like someone already implemented the idea as a gem even before i come up with
http://ruby-jokes.github.io/close_enough/