Ruby allows you to change key functionality of the language. This means, it is also possible to break key functionality! Six examples of Ruby code you should never use:
Undefining Core Methods
The simplest way to change Ruby's global behavior is monkey patching: Nothing stops you from altering important core methods:
class Module; undef append_features; end
This line will break the ability to mix-in modules:
Math.sin 42 # => -0.9165215479156338
include Math
# NoMethodError: undefined method `append_features' for Math:Module
Everything nil
No more NoMethodError: undefined method
or NameError: uninitialized constant
:
class BasicObject
def self.const_missing(*)
end
def method_missing(*)
end
end
Nothing will fail, anymore. Not a good idea. Also see: Hopeless Egocentricity
IDio.synCRATIC # => nil
Alternative Hash Access Semantics
You can redefine hash semantics, to raise an error, if a key was not found:
class Hash
alias [] fetch
end
Now you will always get KeyError
instead of nil
:
{ "Idiosyncratic": "Ruby" }["Sane"]
# `fetch': key not found: "Sane" (KeyError)
You could argue that this is much cleaner than the normal semantics, but you won't be compatible with the rest of the world.
Manipulate Global Randomness
Don't use Kernel#rand
, Array#shuffle
or Array#sample
. Always use SecureRandom!
srand 84 # => (something)
rand 100 # => 42
Change a Global Default Separator
Four of Ruby's special two-letter globals are called record separators and they affect the behaviour of various methods in Ruby:
Variable | Name | Default | Examples for Methods Affected |
---|---|---|---|
$; |
(Input) Field Separator | nil |
String#split |
$, |
Output Field Separator | nil |
Array#join |
$/ |
Input Record Separator | "\n" |
Kernel#gets , IO#readlines |
$\ |
Output Record Separator | nil |
Kernel#print , IO#write |
Not only your own code is affected, but also core functionality. For example, changing the default output separators also changes Ruby's error messages:
>> $, = "YIKES"
>> 123abc
SyntaxErrorYIKES: YIKES(irb):2: syntax error, unexpected tIDENTIFIER, \
expecting end-of-inputYIKES
from /home/user/.rvm/rubies/ruby-2.2.2/bin/irb:11:in `<main>'YIKES
Disabling Garbage Collection
Be careful! This might cause your machine to freeze or even worse!
GC.disable
100_000_000.times.each{ |i| "#{i}" }
More Idiosyncratic Ruby
- Please Comment on GitHub
- Next Article: Stream Editing
- Previous Article: 210 Ways to Rome