7 Stimmen

Ruby-Äquivalente für PHPs magische Methoden __call, __get und __set

Ich bin mir ziemlich sicher, dass Ruby diese hat (Äquivalente für __Aufruf, __Get y __set ), denn wie sonst finden_nach in Rails funktionieren würde? Vielleicht könnte jemand ein kurzes Beispiel dafür geben, wie man Methoden definiert, die genauso funktionieren wie finden_nach ?

Gracias

14voto

hdorio Punkte 12232

Kurz gesagt, Sie können Folgendes abbilden

  • __Aufruf eines method_missing-Aufrufs mit Argumenten
  • __set zu einem method_missing-Aufruf, bei dem der Name der Methode mit '=' endet
  • __get zu einem method_missing-Aufruf ohne Argumente

__Aufruf

php

class MethodTest {
  public function __call($name, $arguments) {
    echo "Calling object method '$name' with " . implode(', ', $arguments) . "\n";
  }
}

$obj = new MethodTest;
$obj->runTest('arg1', 'arg2');

Rubinrot

class MethodTest
  def method_missing(name, *arguments)
    puts "Calling object method '#{name}' with #{arguments.join(', ')}"
  end
end

obj = MethodTest.new
obj.runTest('arg1', 'arg2')

__set und __get

php

class PropertyTest {
  //  Location for overloaded data.
  private $data = array();

  public function __set($name, $value) {
    echo "Setting '$name' to '$value'\n";
    $this->data[$name] = $value;
  }

  public function __get($name) {
    echo "Getting '$name'\n";
    if (array_key_exists($name, $this->data)) {
      return $this->data[$name];
    }
  }
}

$obj = new PropertyTest;
$obj->a = 1;
echo $obj->a . "\n";

Rubinrot

class PropertyTest

  # Location for overloaded data.
  attr_reader :data
  def initialize
    @data = {}
  end

  def method_missing(name, *arguments)
    value = arguments[0]
    name = name.to_s

    # if the method's name ends with '='
    if name[-1, 1] == "="

      method_name = name[0..-2]
      puts "Setting '#{method_name}' to '#{value}'"
      @data[method_name] = value

    else

      puts "Getting '#{name}'"
      @data[name]

    end
  end

end

obj = PropertyTest.new
obj.a = 1 # it's like calling "a=" method : obj.a=(1)
puts obj.a

6voto

Doon Punkte 18824

Die dynamischen Finder werden durch die Implementierung der Methode missing

http://ruby-doc.org/core/classes/Kernel.html#M005925

Werfen Sie einen Blick auf diesen Blogbeitrag, der Ihnen einen Überblick über die Funktionsweise gibt.

http://blog.hasmanythrough.com/2006/8/13/how-dynamic-finders-work

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X