Ruby 将对象从一个类传递到另一个类

Ruby 将对象从一个类传递到另一个类,ruby,Ruby,下面是有效的代码,但我希望它尽可能干净,以获得输出而不必构建散列 class Person attr_accessor :name, :age def initialize(name, age) @name = name @age = age end def create Report.create({name: @name, age: @age}) end end class Report < Person def se

下面是有效的代码,但我希望它尽可能干净,以获得输出而不必构建散列

class Person
  attr_accessor :name, :age
  
  def initialize(name, age)
    @name = name
    @age = age
  end
  
  def create
    Report.create({name: @name, age: @age})
  end
end

class Report < Person
  
  def self.create(attributes)
    puts "Hello, this is my report. I am #{attributes[:name]} and my age is #{attributes[:age]}."
  end
end

me = Person.new("Andy", 34)
me.create # Hello, this is my report. I am Andy and my age is 34.


但是输出是“我是名字,我的年龄是年龄。”

你可以通过这个人,类似这样:

class Person
  attr_accessor :name, :age
  
  def initialize(name, age)
    @name = name
    @age = age
  end
  
  def report
    Report.new(self)
  end
end

class Report
  attr_accessor :person
  
  def initialize(person)
    @person = person
  end

  def to_s
    "Hello, this is my report. I am #{person.name} and my age is #{person.age}."
  end
end

me = Person.new("Andy", 34)
puts me.report
# Hello, this is my report. I am Andy and my age is 34.
请注意,我更改了一些详细信息:

  • 报告
    不从
    人员继承
  • Report
    实例通过
    new
  • Person#create
    现在是
    Person#report
  • Report
    对输出使用
    to_s
    (由
    put
    调用)

类报告
——继承看起来很奇怪。一份
报告
是一种特殊的
吗?名字并不重要,我只是在玩弄代码,看看我是否能让它工作。@Andy
{:name}
将始终按名字计算。插值
#{…}
计算内部的表达式,对其应用
to_s
方法,并使用结果字符串。在您的例子中,内部表达式是
:name
,它属于
Symbol
类。将
to_
应用于符号始终会返回符号的字符串表示形式,即示例中的
name
def self.create(attributes)
  puts "Hello, this is my report. I am #{:name} and my age is #{:age}."
end
class Person
  attr_accessor :name, :age
  
  def initialize(name, age)
    @name = name
    @age = age
  end
  
  def report
    Report.new(self)
  end
end

class Report
  attr_accessor :person
  
  def initialize(person)
    @person = person
  end

  def to_s
    "Hello, this is my report. I am #{person.name} and my age is #{person.age}."
  end
end

me = Person.new("Andy", 34)
puts me.report
# Hello, this is my report. I am Andy and my age is 34.