【问题标题】:Ruby - Making my code object orientatedRuby - 使我的代码面向对象
【发布时间】:2016-04-07 04:32:03
【问题描述】:

我刚刚开始使用 OOP,并且正在努力研究如何实现它。我不知道如何使用hash.new 方法创建类的实例。这是一个基本程序,它从用户那里获取输入并将其存储在哈希中。然后我计划将散列推入一个数组以利用索引。下面是代码

class Customer

    def initialize(id, name, address, phone, email, bank_balance)
        @id = id
        @name = name
        @address = address
        @phone = phone
        @email = email
        @bank_balance = bank_balance
    end
end

puts "Would you like to create an account?"
answer = gets.chomp

loop do

    new_hash = {}
    if answer.downcase.start_with?('y')

        puts "Enter your name"
        name = gets.chomp.downcase
        new_hash['name'] = name

        puts "Enter your address"
        address = gets.chomp.downcase
        new_hash['address'] = address

        puts "Enter your ph number"
        number = gets.chomp
        number = number.split.join
        new_hash['number'] = number

        puts "Enter your email"
        email = gets.chomp.downcase
        new_hash['email'] = email       

        puts "Enter your bank balance"
        bank_balance = gets.chomp
        bank_balance = "$" + '%.2f' % bank_balance
        new_hash['bank_balance'] = bank_balance

        customer << new_hash

        binding.pry
        puts "Thankyou, details successfully Added"

        break
    else
        break
    end
end

【问题讨论】:

  • customer &lt;&lt; new_hash: customer 来自哪里?
  • 你的班级是Customer:你需要customer = Customer.new(id, name, address, phone, email, bank_balance)
  • 感谢@Amadan 的回复。我只是很困惑如何通过客户输入来实现它?
  • 这取代了你的new_hash;删除包含它的每一行。你不厌其烦地创建一个类,然后使用散列来存储你的值。就像盖了豪宅后住在草坪上的拖车里一样。您的用户输入以变量 nameaddress... 结束,然后只需使用这些变量并将其传递给 Customer 构造函数,如我之前的评论所示。
  • 此外,您可以从initialize 中删除参数并设置一些getter / setter (attr_accessor :name, :address, :phone, ...)。这使您可以一一设置客户的属性,即customer = Customer.new 和稍后的customer.name = gets.chomp.downcase

标签: ruby oop


【解决方案1】:

您应该删除 initialize(...) 中的所有内容,而是使用 attr_accessor :name, :address, :phone, :email, :bank_balance) 写在你的初始化语句上面 有关 attr_accessor 的更多信息,请参阅此帖子 What is attr_accessor in Ruby? 还可以通过阅读 attr_reader 和 attr_writer 来跟进

然后,您可以在其余代码中为这些已初始化的变量赋值。 你将通过运行 Customer.new 来调用你的类

您可以通过将gets.chomp 值分配给其他方法来使您的代码更加快速,然后您可以执行类似的操作

class Customer
  attr_accessor :name, :address, :phone
  def initialize
    @name = ''
    @address = ''
    @phone = ''
  end

  def name
    puts "Enter your name"
    name = gets.chomp.downcase
  end
  def address
   puts "Enter your address"
    address = gets.chomp.downcase
  end
  def phone
   puts 'enter your phone'
   phone = gets.chomp
   phone = phone.split.join
  end
  def all
    name
    address
    phone  
  end
end
customer = Customer.new
customer.all

【讨论】:

    猜你喜欢
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    相关资源
    最近更新 更多