Вызов метода, когда имя класса используется как метод - PullRequest
0 голосов
/ 03 февраля 2012

Мне интересно, можно ли определить класс в Ruby для следующего вида использования:

Class Book
    def Book
        puts self.to_s 
    end
    def initialize(name)
        @name = name
    end
    def to_s
        @name.to_s
    end
end

Использование:

Book "To Kill a Mocking Bird"   #=>To Kill a Mocking Bird

Идея, которую я хочу, - этоэто будет вести себя следующим образом

  1. Экземпляр метода создается (как сокращенная).
  2. Метод Book немедленно вызывается после этого и выполняет блок кода.

(Намерение иметь метод, названный так же, как класс, состоит в том, чтобы иметь обратный вызов, когда он используется как метод.)

Это возможно в Ruby?

Ответы [ 2 ]

2 голосов
/ 03 февраля 2012

Как насчет этого?

class Book
  attr_accessor :name

  def initialize(name)
    self.name = name
  end

  def to_s
    name
  end
end

def Book(name)
  Book.new(name)
end

puts Book("To Kill a Mocking Bird")

В качестве незначительного интереса, Модуль Kernel Руби использует такую ​​технику (написанную на C) для реализации методов с именемArray, String и т. Д .:

Array(12)          #=> [12]
String(12)         #=> '12'
Integer('0x12')    #=> 18
0 голосов
/ 03 февраля 2012

Как-то так?

class Book
    def show_me
        puts self.to_s 
    end
    def initialize(name)
        @name = name
        show_me
    end
    def to_s
        @name.to_s
    end
end

show_me будет выполнено, но как только вы создадите новую книгу, объект книги будет возвращен в конце.

>> Book.new "To Kill a Mocking Bird"
To Kill a Mocking Bird
=> #<Book:0x74f63f0 @name="To Kill a Mocking Bird">
...