Ruby类在另一个类中打印名称

时间:2016-02-24 18:43:41

标签: ruby

class NameData
  def initialize
    @name="Cleetus"
  end

  class Greetings
    def hello()
      puts "Hello #{@name}! How wonderful to see you today."
    end
  end
end

greet=Greetings.new
p greet.hello

我是一个初学者,但我想让我的名字在Greetings类中使用,所以字符串将打印出我的名字。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

在Ruby中将多个类放在同一个模块(有时称为“命名空间”)中是很常见的,但是在另一个类中有一个类是不常见的。即使你这样做仍然是一个单独的类,并且无法访问“外部”类中的实例变量。

您需要做的是在NameData对象之外访问@name值。在Ruby中执行此操作的常用方法是使用属性读取器:

class NameData
  attr_reader :name

  def initialize
    @name = "Cleetus"
  end
end

name_data = NameData.new
puts name_data.name
# => Cleetus

完成后,您需要告诉您的Greetings对象有关NameData对象以及如何使用它。一种方法是将NameData对象作为参数传递给hello

class Greetings
  def hello(name_data)
    puts "Hello #{name_data.name}! How wonderful to see you today."
  end
end

greet = Greetings.new
greet.hello(name_data)
# => Hello Cleetus! How wonderful to see you today.

另一种方法是将它传递给Greetings构造函数并将其保存在实例变量中:

class Greetings
  def initialize(name_data)
    @name_data = name_data
  end

  def hello
    puts "Hello #{@name_data.name}! How wonderful to see you today."
  end
end

greet = Greetings.new(name_data)
greet.hello
# => Hello Cleetus! How wonderful to see you today.

答案 1 :(得分:0)

@name变量是实例变量,不同类中的方法无法看到它。它只能通过同一类中的方法来查看。试试这个:

class Greetings
  def initialize
    @name="Cleetus"
  end

  def hello()
    puts "Hello #{@name}! How wonderful to see you today."
  end
end


greet = Greetings.new.hello