scope - The most annoying quirk of class methods in ruby ever -
can spot problem in following code?
module f def f(x) return x*x end end class test3 include f def self.ok(x) return f(2*x) end end
how one?
class test1 def f(x) return x*x end def test1.ok(x) return f(2*x) end end
or maybe this?
class test2 def self.ok(x) def f(x) return x*x end return f(2*x) end end
this not intuitive @ all. why can't ruby find 'f' in of these cases?
like many object-oriented languages, ruby has separation between methods in class context , in instance context:
class example def self.a_class_method "i'm class method!" end def an_instance_method "i'm instance method!" end end
when calling them using native context works:
example.a_class_method example.new.an_instance_method
when calling them in wrong context errors:
example.new.a_class_method # => no such method example.an_instance_method # => no such method
since instance related class can this:
example.new.class.a_class_method # => works!
that's done inside instance methods need use class methods. class methods aren't able utilize instance methods except if there's instance in play. when deciding make method, need consider context in used. if it's instance related, especially if uses @
-style instance variables, it's instance method. if it's generic utility method intended used independent of particular instance, it's class method.
in other languages class methods called "static" methods, they're stand-alone basically, in ruby relate class itself, special object, can little confusing @ times.
that's why paying attention presence of self
in definition important.
Comments
Post a Comment