【问题标题】:Dynamically call a method on an instance of a class (User specifies instance name dynamically)在类的实例上动态调用方法(用户动态指定实例名称)
【发布时间】:2013-10-04 02:58:15
【问题描述】:

我有一个名为Family Members 的类(在文件family_members.rb 中),其中包含namesextyperoleage 等属性。

我创建了实例,称为 fm1fm2 fm3 fm4fm5

#family_members.rb

require_relative 'family'
require_relative 'checkdetails'

class FamilyMembers < Family

  attr_accessor :name, :sex, :status, :age
  def initialize (name, sex, type, role, age)
    @name = name
    @sex = sex
    @type = type
    @role = role
    @age = age
  end

end

fm1 = FamilyMembers.new('Andrew','Male', 'Child', "Son" , "27" )
fm2 = FamilyMembers.new("Bill","Male", "Parent", "Father" , "63" )
fm3 = FamilyMembers.new("Samantha","Female", "Parent", "Mother" , "62" )
fm4 = FamilyMembers.new("Thomas","Male", "Child", "Dog" , "10" )
fm5 = FamilyMembers.new("Samantha", 'Female', "Child", "Dog" , "4" )

我有一个名为Parent?的方法,它检查类的实例是Parent还是Child,它的调用如下所示:

#check_details   //would like to use this method

fm4.parent?

用户是否可以动态选择要检查的类的哪个实例?

我在checkdetails.rb 文件中创建了一个名为check_details 的方法:

#checkdetails.rb

def check_details
  puts "What family to you want to check? choose 1 to 5"
  $family = 'fm' + gets.chomp
end

但是,如果我尝试像这样调用parent 方法:

check_details

$family.parent?

它给了我以下错误:

`<top (required)>': undefined method `parent?' for "fm1":String (NoMethodError)
    from -e:1:in `load'
    from -e:1:in `<main>'

有没有办法动态地做到这一点?可能没有全局变量 - 因为这被认为是不好的做法?

感谢您的帮助。

【问题讨论】:

  • 你可以做你想做的事。检查Kernel#eval 方法。在这种情况下,您的代码将如下所示:num = gets.chomp; eval("fm#{num}.parent?") 但最好使用Array / Hash of FamilyMembers

标签: ruby class dynamic methods user-input


【解决方案1】:

将您的 FamilyMembers 存储在数组或散列中,然后按键查找。

fm = {}
fm[1] FamilyMembers.new('Andrew','Male', 'Child', "Son" , "27" )
fm[2] = FamilyMembers.new("Bill","Male", "Parent", "Father" , "63" )
fm[3] = FamilyMembers.new("Samantha","Female", "Parent", "Mother" , "62" )
fm[4] = FamilyMembers.new("Thomas","Male", "Child", "Dog" , "10" )
fm[5] = FamilyMembers.new("Samantha", 'Female', "Child", "Dog" , "4" )

answer = "3" # get this from the user.
num = answer.to_i

if fm.key?(num)
  fm[num].parent?
else 
  raise 'Invalid answer'
end

附: Ruby 指南建议“FamilyMembers”类应称为“FamilyMember”。

【讨论】:

  • 谢谢,马上试试!
  • 谢谢这个作品,我会接受你的回答。但是,我尝试将所有代码放在另一个文件中名为check_details 的方法中,但它不会让我调用它,错误消息是undefined local variable or method 'check_details' for main:Object (NameError).. 这很奇怪,因为我已经能够调用其他方法从这个文件。你对此有什么想法吗?谢谢
  • @Jenny 不。它不能在需要时加载。祝你好运!
猜你喜欢
  • 2015-01-17
  • 2015-04-16
  • 1970-01-01
  • 2011-08-07
  • 2012-04-16
  • 2012-12-19
  • 1970-01-01
  • 2013-01-09
  • 2018-09-10
相关资源
最近更新 更多