ruby - Is there a difference between @var = var_val and self.send("var=", var_val)? -
when initialize instance variables in initialize method, there difference between using @var = var_value , self.send("var=", var_value)? mean, there reason prefer 1 way on other reason, if means style reason?
class mysuperclass attr_accessor :columns, :options end class mysubclass < mysuperclass def initialize(columns, options) @columns = columns @options = options end end class myothersubclass < mysuperclass def initialize(columns, options) self.send("columns=", columns) self.send("options=", options) end end
there difference.
@var = x assigns instance variable. there no method call. there no virtual dispatch. there no (sane) way of intercepting assignment.
send invokes method (or "sends message"). in context, :var= assessor "setter method" wraps instance variable assignment. it's method, invoked via virtual dispatch honoring inheritance, , - including being overridden in subtypes.
the true equivalent @var = x instance_variable_set:
self.instance_variable_set(:@var, x) using send in case odd. use accessor directly (self.columns = columns) if intent.
as 1 "more correct" depends on level of encapsulation established - , contracts defined on types , usages thereof. err on side of accessors when subtypes involved.
Comments
Post a Comment