2014-10-29 3 views
1

Я знаю, что self.class.name возвращает имя класса, но как насчет экземпляра?Как получить имя экземпляра? ruby

Например, этот код

module Selling 
    def sell 
    puts "#{self.class.name} has been sold" 
    end 
end 

class Shop 
    include Selling 
    def initialize(id) 
    @id=id 
    end 
end 

book=Shop.new(1132) 
book.sell 

отпечатки Shop и что мне нужно, это book

+0

Я не понимаю ваш пример кода. «Магазин» магазин или книга? И '1132' идентификатор магазина или идентификатор книги? – Stefan

ответ

2

объекты не имеют имен. На них может ссылаться или не ссылаться одна или несколько переменных, но нет способа узнать, какие переменные ссылаются на объект и каковы имена этих переменных.

Модули - это особый случай, их метод name действительно возвращает имя первой константы, которой они были назначены, но это магия интерпретатора.

+0

Спасибо за ответ! – user3713267

0

Jörg W Mittag already explained что вы не можете проверять имена переменных.

Вот попытка решить проблему с помощью отдельного Book экземпляра с атрибутом name:

module Selling 
    def sell(item) 
    puts "#{item.name} has been sold" 
    end 
end 

class Shop 
    include Selling 
end 

class Book 
    attr_accessor :name 
    def initialize(name) 
    @name = name 
    end 
end 

bookstore = Shop.new 

book1 = Book.new('Moby-Dick') 
book2 = Book.new('Of Mice and Men') 

bookstore.sell(book1) 
bookstore.sell(book2) 

Выход:

Moby-Dick has been sold 
Of Mice and Men has been sold 
+0

Спасибо за ответ! Я уже сделал это сам:) – user3713267