Ruby-使用错误数量的参数初始化对象
在下面的代码中,我收到了以下错误:“sandbox2.rb:150:in`initialize':参数数量错误(4代表0)(ArgumentError)”,尽管我认为参数数量应该可以 程序从多个文件加载数据,在“加载订单”方法中,它应该从xml文件中提取两个地址,并使用4个参数(订单号、日期、账单地址、发货地址)创建对象tmp订单。但是为什么不创建对象呢?我错过了什么 我也附上下面的order.rbRuby-使用错误数量的参数初始化对象,ruby,initialization,Ruby,Initialization,在下面的代码中,我收到了以下错误:“sandbox2.rb:150:in`initialize':参数数量错误(4代表0)(ArgumentError)”,尽管我认为参数数量应该可以 程序从多个文件加载数据,在“加载订单”方法中,它应该从xml文件中提取两个地址,并使用4个参数(订单号、日期、账单地址、发货地址)创建对象tmp订单。但是为什么不创建对象呢?我错过了什么 我也附上下面的order.rb # -*- coding: utf-8 -*- require 'rexml/document
# -*- coding: utf-8 -*-
require 'rexml/document'
require 'time'
require_relative "product.rb"
require_relative "store.rb"
require_relative "customer.rb"
require_relative "order.rb"
class Shop
def initialize(arguments)
# 1. Overte spravne mnozstvi argumentu. V pripade chyby vyvolejte vyjimku.
# 2. Ulozte si argumenty do vhodnych promennych pro pozdejsi pouziti
# vyjimkou osetrime spravny pocet parametru
begin
raise Exception.new if arguments.length != 5
rescue Exception
puts "Špatný počet parametrů programu."
puts "Správné použití je: "
puts "ruby main.rb products.xml store.xml orders.xml store_output.xml customers.xml"
exit
end
puts "Počet parametrů je OK"
# iterujeme polem arguments a parametry prirazujeme do promennych
arguments.each do |arg|
if arg == "orders.xml"
@fn_orders = arg
elsif arg == "products.xml"
@fn_products = arg
elsif arg == "store.xml"
@fn_store = arg
elsif arg == "store_output.xml"
@fn_out_products = arg
elsif arg == "customers.xml"
@fn_out_customers = arg
end
end
end
def load_products
# 1. Nactete XML soubor s produkty. V pripade problemu (napr. neexistujici soubor) vyvolejte vyjimku.
# 2. Prochazejte XML soubor a vytvarejte nove objekty tridy Produkt. Nezapomente odchytavat vyjimky.
begin
File.open(@fn_products, "r") do |file|
doc = REXML::Document.new(file)
doc.root.elements.each do |elems|
# vytvorime produkt s atributy code, name a price
product = Product.new(elems.attributes["code"].strip,
elems.elements["name"].text,
elems.elements["price"].text)
# vypise atribut code
# puts elems.attributes["code"].strip
# vypise podelement name a cena
# puts elems.elements["name"].text
# puts elems.elements["price"].text
end
end
rescue Exception
puts "Nelze otevřít soubor #{@fn_products} - konec programu."
end
end
def load_store
@store = Store.new
# 1. Nactete XML soubor se stavem skladu. V pripade problemu (napr. neexistujici soubor) vyvolejte vyjimku.
# 2. Prochazejte XML soubor a volejte @store.add_product.
begin
File.open(@fn_store, "r") do |file|
doc = REXML::Document.new(file)
doc.root.elements.each do |elems|
# pridame do @store produkt dle code a nastavime jeho mnozstvi dle amount
@store.add_product((elems.attributes["code"].strip),(elems.attributes["amount"].strip))
end
end
# osetreni vyjimky pro pripad, ze soubor neexistuje
rescue Exception
puts "Nelze otevrit soubor #{@fn_store} - konec programu."
exit
end
end
def load_orders
@orders = []
# 1. Nactete XML soubor s objednavkami. V pripade problemu (napr. neexistujici soubor) vyvolejte vyjimku.
# 2. Prochazejte XML soubor a pro jednotlive objednavky:
# 2a. Vytvorte novy objekt tridy Order.
# 2b. Pro jednotlive polozky objednavky vytvorte novy objekt tridy OrderItem a predejte jej metode add_item.
# 2c. Pridejte objednavku do pole @orders.
puts "zacatek load orders"
gets
# begin
File.open(@fn_orders, "r") do |file|
doc = REXML::Document.new(file)
doc.root.elements.each do |elems|
# temp promenne pro ukladani objektu zakazniku
# spolu s billing a shipping adres
tmp_bill_addr = ""
tmp_ship_addr = ""
# iterujeme pres elementy address
elems.elements.each("address") do |addr|
# jmeno a billing address hodnoty ulozime do objektu customer
if (addr.attributes["type"].strip == "billing")
tmp_bill_addr = Customer.new(addr.elements["name"].text,
Address.new(addr.elements["street"].text,
addr.elements["city"].text,
addr.elements["state"].text,
addr.elements["zip"].text,
addr.elements["country"].text))
end
# jmeno a shipping address hodnoty ulozime do objektu customer
if (addr.attributes["type"].strip == "shipping")
tmp_ship_addr = Customer.new(addr.elements["name"].text,
Address.new(addr.elements["street"].text,
addr.elements["city"].text,
addr.elements["state"].text,
addr.elements["zip"].text,
addr.elements["country"].text))
end
end
# vytvorime objekt s objednavkou
puts "ladici vypis ted"
puts tmp_bill_addr.address.street
puts elems.attributes["number"]
puts Time.xmlschema(elems.attributes["date"])
puts tmp_ship_addr
puts "here is the problem"
tmp_order = Order.new(elems.attributes["number"],Time.xmlschema(elems.attributes["date"]),tmp_bill_addr,tmp_ship_addr)
puts tmp_order
# dodame do nej jednotlive polozky
# elems.elements.each("items/item") do |item|
# tmp_ord_itm = OrderItem.new(item.attributes["code"],
# item.elements["name"].text, item.elements["price"].text,
# item.elements["quantity"].text)
# tmp_order.add_item(tmp_ord_itm)
# end
puts "tady jsem skoncil"
# @orders << tmp_order
end
end
# rescue Exception
# puts "Nelze otevřít soubor #{@fn_orders} - konec programu."
# exit
# end
puts "konec load orders"
end
def process_order(order)
# Zpracujte objednavku.
# Prochazejte jednolive polozky objednavky a provadejte zadane kontroly.
# V pripade, ze je vse v poradku, upravte stav skladu volanim @store.sell_product.
# Nezapomente si ulozit udaje o zakaznikovi.
end
def process_orders
# Zpracujte objednavky. Zde se deje samotna logika programu, ktera je podrobne popsana v zadani.
# Seradte objednavky dle data a v poradi od nejstarsi je zacnete zpracovavat volanim metody process_order.
end
def save_store
# Projdete produkty v @store a ulozte je do XML souboru.
end
def save_customers
# Projdete zakazniky ziskane ze zpracovanych zakazek a ulozte je do XML souboru.
end
def run
# Doplnte reseni vyjimek.
puts "jsme v runu"
gets
load_products
puts "produkty nacteny"
gets
load_store
puts "sklad nacten"
load_orders
process_orders
save_store
save_customers
end
end
shop = Shop.new(ARGV)
shop.run
#-*-编码:utf-8-*-
需要“rexml/文档”
需要“时间”
需要相对的“product.rb”
需要相对的“store.rb”
需要相对的“customer.rb”
需要相对的“order.rb”
班级商店
def初始化(参数)
# 1. 公开讨论。V pripade chyby vyvolejte vyjimku。
# 2. 我认为这是一个很好的解决方案
#vyjimkou osetrime spravny pocet parametru
开始
引发异常.new if arguments.length!=5.
救援例外
将“ýpatnýpočet parametrůprogramu.”
将“Správnépoužitíje:”
放入“ruby main.rb products.xml store.xml orders.xml store_output.xml customers.xml”
出口
结束
将“Počet Parameterůje OK”放入
#这是一个参数化的参数
参数。每个do | arg|
如果arg==“orders.xml”
@fn_订单=arg
elsif arg==“products.xml”
@fn_产品=arg
elsif arg==“store.xml”
@fn_store=arg
elsif arg==“store_output.xml”
@fn_out_products=arg
elsif arg==“customers.xml”
@fn\u out\u customers=arg
结束
结束
结束
def load_产品
# 1. Nactete XML soubor的产品。V pripade problemu(napr.neexistujici soubor)vyvolejte vyjimku。
# 2. prochazejtte XML soubor是一个Vytvarejtte nove objekty tridy Produkt。内扎波门特·奥奇塔瓦特·维吉姆基。
开始
打开(@fn_products,“r”)do| File|
doc=REXML::Document.new(文件)
doc.root.elements.each do | elems |
#vytvorime产品代码,说出价格
product=product.new(元素属性[“代码”].strip,
元素元素[“名称”]。文本,
元素元素[“价格”]。文本)
#vypise码
#将元素属性[“代码”]放入条带
#vypise podelement名称a cena
#将elems.elements[“name”]放入文本
#放置元素元素[“价格”].text
结束
结束
救援例外
将“Nelze otevřít soubor{@fn_products}-konec programu”放在一起
结束
结束
def加载存储
@store=store.new
# 1. Nactete XML soubor se stavem skladu。V pripade problemu(napr.neexistujici soubor)vyvolejte vyjimku。
# 2. Prochazejte XML soubor a volejte@store.add\u产品。
开始
打开(@fn_store,“r”)do| File|
doc=REXML::Document.new(文件)
doc.root.elements.each do | elems|
#pridame do@store produkt dle代码a nastavime jeho mnozstvi dle金额
@存储.添加产品((元素属性[“代码”].strip),(元素属性[“金额”].strip))
结束
结束
#osetreni vyjimky pro pripad,ze soubor neexistuje
救援例外
放上“Nelze otevrit soubor{@fn_store}-konec programu。”
出口
结束
结束
def加载命令
@订单=[]
# 1. Nactete XML soubor的objednavkami。V pripade problemu(napr.neexistujici soubor)vyvolejte vyjimku。
# 2. Prochazejte XML soubor一个pro-jednotlive对象:
#2a。Vytvorte novy objekt三轮车订单。
#2b。ProJednotLive polozky objednavky vytvorte novy objekt tridy OrderItem a predejte jej metode add_项目。
#2c。订单上的订单。
放置“zacatek装载订单”
得到
#开始
打开(@fn_orders,“r”)do|File|
doc=REXML::Document.new(文件)
doc.root.elements.each do | elems|
#临时协议
#spolu的帐单是一个装运地址
tmp_bill_addr=“”
tmp_ship_addr=“”
#iterujeme公司地址
元素。元素。每个(“地址”)不添加|
#jmeno a账单地址hodnoty ulozime do objektu客户
if(地址属性[“类型”].strip==“账单”)
tmp_bill_addr=Customer.new(addr.elements[“name”]。text,
新地址(地址元素[“街道])。文本,
地址元素[“城市”]。文本,
地址元素[“状态”]。文本,
地址元素[“zip”]。文本,
地址元素[“国家”]文本)
结束
#jmeno a发货地址hodnoty ulozime do objektu客户
if(地址属性[“类型”].strip==“装运”)
tmp_ship_addr=Customer.new(addr.elements[“name”].text,
新地址(地址元素[“街道])。文本,
地址元素[“城市”]。文本,
地址元素[“状态”]。文本,
地址元素[“zip”]。文本,
地址元素[“国家”]文本)
结束
结束
#vytvorime对象对象s对象对象
把“ladici vypis ted”
将tmp_bill_addr.address.street放入
放置元素属性[“数字”]
放置Time.xmlschema(elems.attributes[“date”])
将tmp_装运地址
“问题就在这里”
tmp_order=order.new(elems.attributes[“number”]、Time.xmlschema(elems.attributes[“date”])、tmp_bill_addr、tmp_ship_addr)
下订单
#dodame do nej jednotlive polozky
#元素。元素。每个(“项目/项目”)都做|项|
#tmp_ord_itm=OrderItem.new(item.attributes[“code”],
#item.elements[“name”]。文本,item.elements[“price”]。文本,
#项目.要素[“数量”]
# -*- coding: utf-8 -*-
class OrderItem
# Doplnte.
attr_reader :product_code, :product_name, :price, :quantity
def initialize(product_code, product_name, price, quantity)
# Doplnte.
@product_code = product_code
@product_name = product_name
@price = price.to_i
@quantity = quantity.to_i
end
end
class Order
# Doplnte.
attr_reader :order_number, :date, :shipping_address, :billing_address, :items
def initilize(order_number, date, shipping_address, billing_address)
# Doplnte.
@items = []
@order_number = order_number
@date = date
@shipping_address = shipping_address
@billing_address = billing_address
end
def add_item(item)
@items << item
end
end
def initilize(order_number, date, shipping_address, billing_address)
def initialize(order_number, date, shipping_address, billing_address)
def initialize(order_number, date, shipping_address, billing_address)
# Doplnte.
@items = []
@order_number = order_number
@date = date
@shipping_address = shipping_address
@billing_address = billing_address
end