Пусть исходные данные будут a
, я думаю, что вы хотели это:
def expand s, x = nil, *a
case x
when Hash then x[:choices].each{|x| expand(s, x, *a)}
when Array then expand(s, *x, *a)
when String then expand(s+x, *a)
when nil then @combination << s
end
end
@combination = []
expand("", a)
@combination # => result
Но данные, которые вы предоставляете, неверны. Это не дает того, что вы хотите:
a = [
{:choices=>["Hello", "Hi"]},
" ",
{:choices=>["wor", {:choices=>["ld", "d"]}, "there"]},
", says ",
"your ",
{:choices=>["friend", "amigo"]}
]
@combination = []
expand("", a)
@combination # =>
["Hello wor, says your friend",
"Hello wor, says your amigo",
"Hello ld, says your friend",
"Hello ld, says your amigo",
"Hello d, says your friend",
"Hello d, says your amigo",
"Hello there, says your friend",
"Hello there, says your amigo",
"Hi wor, says your friend",
"Hi wor, says your amigo",
"Hi ld, says your friend",
"Hi ld, says your amigo",
"Hi d, says your friend",
"Hi d, says your amigo",
"Hi there, says your friend",
"Hi there, says your amigo"]
Если вы измените его на
a = [
{:choices=>["Hello", "Hi"]},
" ",
{:choices=>[[
"wor",
{:choices=>["ld", "d"]}
], "there"]},
", says ",
"your ",
{:choices=>["friend", "amigo"]}
]
тогда вы получите:
@combination = []
expand("", a)
@combination # =>
["Hello world, says your friend",
"Hello world, says your amigo",
"Hello word, says your friend",
"Hello word, says your amigo",
"Hello there, says your friend",
"Hello there, says your amigo",
"Hi world, says your friend",
"Hi world, says your amigo",
"Hi word, says your friend",
"Hi word, says your amigo",
"Hi there, says your friend",
"Hi there, says your amigo"]