2014-10-08 39 views
0

我知道这段代码看起来不太好,但我只是想解释我的需求。我想知道是否有任何好的或替代的方法。将动态值附加到ruby实例变量

其实,我想创建一个新的堆栈,并且只要一个堆栈已经达到其容量。我想跟踪像@stack_1,@stack_2 ...创建的堆栈数量,通过增加@number += 1(如@[email protected])。并且对于每个堆栈,我想维护一个@current_position指针,这个指针特定于每个堆栈,如@stack_2@current_position_2。所以我想创建动态实例变量。

实施例:

def initialize 
    @number = 1 
    @stack+"#{@number}" = Array.new(10) 
    @current_position_"#{@number}" = 0 
end 

输出应该是这样@stack1 = Array.new(10)
比方说,如果我增加的@number += 1价值,它应该看起来像@stack2 = Array.new(10)

+0

你能解释一下你想达到什么样的? – Stefan 2014-10-08 10:25:11

+0

hi @Stefan,在我想达到的目标上添加更多信息。 – 2014-10-08 16:57:40

回答

1

你可以这样说:

instance_variable_set("@stack#{@number}", Array.new(10, :a)) 
@stack1 
    #=> [:a, :a, :a, :a, :a, :a, :a, :a, :a, :a] 

instance_variable_set("@stack#{@number+1}", Array.new(10, :b)) 
@stack2 
    #=> [:b, :b, :b, :b, :b, :b, :b, :b, :b, :b] 

instance_variable_set("@current_position_#{@number}", 0) 
@current_position_1 
    #=> 0 
+0

如何实现@current_position _“#{@ number}”= 0?这不是一个instance_variable – 2014-10-08 06:34:18

+0

最后一个加法是否回答你的问题? – 2014-10-08 06:39:24

+0

是的..我可以在我的程序中定期使用'@ stack1'和'@ current_position_1'吗? – 2014-10-08 06:42:28

2

代替阵列的,我建议你使用哈希表

@stack = Hash.new 

@stack[@number] = <Your Array> 

要小心,如果该@number是相同的阵列将被取代..

有关哈希的更多信息映射http://www.ruby-doc.org/core-1.9.3/Hash.html

+0

你能解释为什么要使用散列来代替数组吗?我的要求是创建许多堆栈。散列是否像所有堆栈的占位符一样? – 2014-10-08 06:15:05

+0

@RahulSambari是的..它会 – Raghuveer 2014-10-08 06:15:55

+0

虐待尝试适合这个建议到我的场景,并让你知道 – 2014-10-08 06:18:39

1

您可以创建一个Stack类,用于在内部跟踪其状态,而不是创建实例变量以从外部跟踪堆栈的状态。这里是一个非常简单的一个:

class StackOverflow < StandardError; end 

class Stack 
    def initialize 
    @stack = [] 
    end 

    def position 
    @stack.size 
    end 

    def full? 
    position == 2 # small size for demonstration purposes 
    end 

    def push(obj) 
    raise StackOverflow if full? 
    @stack << obj 
    end 
end 

stack = Stack.new 
stack.push "foo" 
stack.full?  #=> false 

stack.push "bar" 
stack.full?  #=> true 

stack.push "baz" #=> StackOverflow 

有一个工作组,您可以建立像一个StackGroup处理多个栈:

class StackGroup 
    attr_reader :stacks 

    def initialize 
    @stacks = [Stack.new] 
    end 

    def push(obj) 
    @stacks << Stack.new if @stacks.last.full? 
    stacks.last.push(obj) 
    end 
end 

stack_group = StackGroup.new 
stack_group.push "foo" 
stack_group.push "bar" 
stack_group.stacks.size #=> 1 

stack_group.push "baz" # no error here 
stack_group.stacks.size #=> 2 

stack_group.stacks 
#=> [#<Stack:0x007f9d8b886b18 @stack=["foo", "bar"]>, 
# #<Stack:0x007f9d8b886a50 @stack=["baz"]>] 
+0

我很抱歉,但不知何故..我有点困惑与你的方法。你可以添加一些评论,或者有没有简单的方法动态地将数字添加到实例变量?这将是非常有帮助的。 – 2014-10-09 03:08:38

+0

@RahulSambari这里不需要动态创建的实例变量。 'stack_groups'跟踪和装箱堆栈,每个堆栈跟踪它的位置。 'stack_groups.stacks.size'返回栈的总数,'stack_groups.stacks [0] .position'返回第一个栈的位置,'stack_groups.stacks [1] .position'返回第二个栈的位置,依此类推。 – Stefan 2014-10-09 07:18:44