0

最近开始学习 ruby​​,我为家庭成员创建了一个包含姓名、年龄、性别、婚姻状况和特征的类。我正在尝试编写一种方法来确定家庭成员是否为父母以及是否为母亲或父亲。

所以该方法的代码如下:

def is_father?(age, sex)
    if age > 30
      puts "is parent"
          if sex == "Male"
            then puts "is father"
          else puts "not father"
          end
    end
  end

家庭成员可能看起来像这样:

fm1=Family.new("John", "Male", 54, "Married", "Annoying")

像这样初始化后:

class Family
  def initialize(name, sex, age, status, trait)
    @fam_name=name
    @fam_sex=sex
    @fam_age=age
    @fam_stat=status
    @fam_trait=trait
  end
end

如果一个人包含前面提到的特征,我如何将年龄+性别传递到这个方法中?在此先感谢您的帮助

4

3 回答 3

1

您必须在初始化期间将数据存储在属性中。稍后您可以在不使用方法参数的情况下使用它们。

例子:

class Family
   def initialize(name, sex, age, status, trait)
    @fam_name=name
    @fam_sex=sex
    @fam_age=age
    @fam_stat=status
    @fam_trait=trait
  end
  def is_parent?; @fam_age > 30;end
  def is_father?
    is_parent? and @fam_sex == "Male"
  end
  def to_s
    result = @fam_name.dup
    if @fam_age > 30
      result <<  " is parent and is "
          if @fam_sex == "Male"
            result << "father"
          else 
            result << "not father"
          end
      end
    result
  end
end

fm1=Family.new("John", "Male", 54, "Married", "Annoying")
puts fm1.ilding is_parent?
puts fm1.is_father?
puts fm1

评论:

  • 我修改了你的is_father?- 方法?通常返回一个布尔值。
  • 我将您的文本构建移至 method to_sto_s如果您使用 打印您的对象,则会调用它puts
  • 最好避免puts在你的方法中。大多数时候,最好puts在调用该方法时返回一个答案字符串并制作。

也许我误解了你的要求。

如果is_father?没有 Family 的方法并且您需要访问属性,那么您必须定义一个 getter 方法:

class Family
  def initialize(name, sex, age, status, trait)
    @fam_name=name
    @fam_sex=sex
    @fam_age=age
    @fam_stat=status
    @fam_trait=trait
  end
  attr_reader :fam_sex
  attr_reader :fam_age
end

fm1=Family.new("John", "Male", 54, "Married", "Annoying")
puts fm1.fam_sex
puts fm1.fam_age


is_father?(fm1.fam_age, fm1.fam_sex)
于 2012-10-02T20:51:29.810 回答
0

一旦你初始化了年龄/性别/等,你可以通过@age//以任何方法使用它们@sex@etc

def is_father?(age = nil, sex = nil)
    if (age || @age) > 30
        puts "is parent"
    end
    if (sex || @sex) == "Male"
        puts "is father"
    else 
        puts "not father"
    end
end

在上面的示例中,如果您将值传递给方法,则将使用它们而不是在初始化时设置的值

于 2012-10-02T21:08:17.817 回答
0

使用 Struct 可以节省大量代码

class Family < Struct.new(:name, :sex, :age, :status, :trait)
  # define methods in usual manner
end

f = Family.new("John", 'male') #<struct Family name="John", sex="male", age=nil, status=nil, trait=nil>
于 2012-10-02T21:20:26.280 回答