2016-12-08 23 views
0
a = ["Select", "Choice", "Prime"] 
a.each do |f| 
    f.downcase = f.new 
    f.grade = f 
end 

是不是一个办法做到这一点红宝石实例化类中的每个

select = Steak.new 
select.grade = "Select" 
choice = Steak.new 
choice.grade = "Choice" 
prime = Steak.new 
prime.grade = "Prime" 

是否有可能在所有实例使用每个几个类似的类?

或者换个方式吗?必须能够更有效地做到这一点。

+1

哪儿了你期望“牛排”来自哪里? – ndn

+0

除了提供的答案,您可能会对Ruby中的并行赋值感兴趣。'a,b,c = [1,2,3]'然后'a#=> 1','b#=> 2'和'c#=> 3'。 –

回答

0

当然,您可以:

grades = ["Select", "Choice", "Prime"] 
steaks = [] 
grades.each do |grade| 
    s = Steak.new 
    s.grade = grade 
    steaks << s 
end 
+0

@BigRon当我使用'.map'时,s将被自动放入结果数组中。我更新了使用'.each'并明确地保存's'。谢谢! –

+0

谢谢!这样做,我可以访问像这样的实例:'steaks [0] .grade',这不是很清楚,即如果我需要比较'steaks [0] .grade thiebo

0

OK,很简单:

grades = ["Select", "Choice", "Prime"] 
steaks = grades.map do |grade| 
    steak = Steak.new 
    steak.grade = grade.downcase 
    steak 
end 

然而,它确实看起来档次是牛排的一个重要特征。也许它应该是这样的构造函数的一部分?

grades = ["Select", "Choice", "Prime"] 
steaks = grades.map {|grade| Steak.new(grade.downcase) } 

我认为创建初始化方法可以作为读者的练习。

+0

我现在这样做: 'grades = [“Slect”,“Choice”,“Prime”] names = grades.map {| j | j.downcase} names.zip(grades){| r,n | \t R = Steak.new \t r.grade = N \t r.grade }' – thiebo

+0

@thiebo:这是...一个奇怪的事情。你想用这种'.zip'完成什么? –

0

如果你想命名每个实例(所以使用散列而不是数组),你可以这样做:

steaks = {} 
["Select", "Choice", "Prime"].each do |grade| 
    # I think using a symbol as key in this case is nicer 
    steaks[grade.downcase.to_sym] = Steak.new(grade) 
end 

还是有点短/最佳使用地图就像你问(支持从红宝石2.1开始):

steaks = ["Select", "Choice", "Prime"].map{ |g| 
    [g.downcase.to_sym, new Steak(grade)] 
}.to_h 

另一种方法是创建一个Butcher类抽象了这一切。

butcher = new Butcher.new 
butcher.addNewSteak(Steak.new("Select")) 
butcher.addNewSteak(Steak.new("Choice")) 
butcher.addNewSteak(Steak.new("Prime")) 

# Or added/created using a loop 
["Select", "Choice", "Prime"].each do |grade| 
    butcher.addNewSteak(Steak.new(grade) 
end 

# Get a list of steaks 
butcher.getAllSteaks() 

# Get steak by grade 
bucher.getSteakByGrade("Select") 

# Get all steaks by grade greater than 
bucher.getSteakGradeGT("Choice") 

屠夫类的实施被故意遗漏。制定是为了应对亚历杭德罗·C的答案下提出的问题

0

做的最简单的方法是什么,你都在问:

steaks = ["Select", "Choice", "Prime"].map do |grade| 
    s = Steak.new 
    s.grade = grade.downcase 
    s 
end 

在另一方面,我建议grade为可变成员。可变性,导致错误。如果gradeSteak一个基本组成部分,它应该在构造函数初始化:

class Steak 
    def initialize(grade) 
    @grade = grade.downcase 
    end 
end 

那么你的代码会更简单

steaks = ["Select", "Choice", "Prime"].map do |grade| 
    Steak.new grade 
end 
0

通过这种结构,你得到例如哈希作为键的:prime和作为值的Steak.new("Prime")。 这使得它更容易遍历所有的牛排,如果你想有一个特定的一个,只需使用steaks[:prime]

class Steak 
    attr_reader :grade 
    def initialize(grade) 
    @grade = grade 
    end 

    def to_s 
    format("Steak %s", grade) 
    end 
end 

steaks = ["Select", "Choice", "Prime"].map{|grade| [grade.downcase.to_sym, Steak.new(grade)]}.to_h 

p steaks 
# {:select=>#<Steak:0x000000013e7000 @grade="Select">, 
# :choice=>#<Steak:0x000000013e6f60 @grade="Choice">, 
# :prime=>#<Steak:0x000000013e6ec0 @grade="Prime">} 

puts steaks.values 
# Steak Select 
# Steak Choice 
# Steak Prime 

puts steaks[:select].grade # => "Select" 

如果你真的想为你的牛排3个独立的变量:

select, choice, prime = ["Select", "Choice", "Prime"].map{|grade| Steak.new(grade)}