Wie Tadman sagt, können Sie self =
nicht schreiben. Sie könnten jedoch eine Methode schreiben, die den Namen der Instanzvariable übernimmt und sie festlegt.
Sie haben Kommentare, dass dies "unelegant" oder "fehlgeleitet" ist. Obwohl ich dieses Urteil nicht teile, ist es gute Praxis, unprätentiösen Code zu schreiben, der so weit wie möglich Standardkonventionen verwendet. Dies hilft anderen, Ihren Code leicht zu verstehen. I.e. es ist wahrscheinlich nicht produktiv, alternative Syntaxen für solche fundamentalen Ruby-Methoden wie ||=
zu schreiben; Andere Leute werden viel durch Ihren Code tun müssen, um zu verstehen, wie die Dinge funktionieren.
aber sagen, dass im Interesse der Lehre, wie Ruby tun, was Sie wollen, kann ich diese Object
Verfahren zu diesem Zweck vorschlagen:
class Object
def assign(key)
# make sure the key is a valid instance variable
unless key =~ /^[A-Za-z0-9\_]+$/
raise ArgumentError, "#{key} is not a valid ivar name"
end
if instance_variable_get("@#{key}").nil?
instance_variable_set("@#{key}", yield)
end
end
end
# example
class Foo
def set_bsd
assign("bsd", yield)
end
end
foo = Foo.new
foo.assign("my_ivar") { "val" }
foo
# => #<Foo:0x007fc2e4ccaca0 @asd=1>
foo.set_bsd { 2 }
foo
# => #<Foo:0x007fc2e4ccaca0 @asd=1 @bsd = 2>
obwohl ich Object
gegen das Patchen empfehlen würde in auf diese Weise - es ist zu allgemein eine Klasse und könnte unbeabsichtigte Konflikte mit internen Funktionen haben. Fügen Sie diese Funktionalität lieber einer benutzerdefinierten Klasse/einem benutzerdefinierten Modul und entweder include
dem Modul hinzu oder erben Sie die Klasse.
Sie können 'if self.instance_of 'ersetzen? NilClass ('self.not needed, btw) mit' if nil? '. (Siehe [Objekt # nil?] (http://ruby-doc.org/core-2.3.0/Object.html#method-i-nil-3F).) Für viele Unterklassen von 'Object' - aber nicht Alles - Sie könnten schreiben "ersetzen Ausbeute wenn Null?". –