Ruby deep nested hash from array2019 Community Moderator ElectionCalling shell commands from RubyA concise explanation of nil v. empty v. blank in Ruby on RailsHow to write a switch statement in RubyHow to convert a string to lower or upper case in RubyCheck if a value exists in an array in Rubyclass << self idiom in RubyWhat is attr_accessor in Ruby?How to remove a key from Hash and get the remaining hash in Ruby/Rails?Why is it bad style to `rescue Exception => e` in Ruby?Access / process (nested) objects, arrays or JSON
Create chunks from an array
Why aren't there more Gauls like Obelix?
Is it a Cyclops number? "Nobody" knows!
Is the differential, dp, exact or not?
Rationale to prefer local variables over instance variables?
Is it appropriate to ask a former professor to order a library book for me through ILL?
What do you call someone who likes to pick fights?
What can I do if someone tampers with my SSH public key?
Can Witch Sight see through Mirror Image?
Why do phishing e-mails use faked e-mail addresses instead of the real one?
Does the US political system, in principle, allow for a no-party system?
What is the purpose of a disclaimer like "this is not legal advice"?
How does learning spells work when leveling a multiclass character?
Insult for someone who "doesn't know anything"
Was this cameo in Captain Marvel computer generated?
Is there a math expression equivalent to the conditional ternary operator?
Limpar string com Regex
How to make sure I'm assertive enough in contact with subordinates?
Interpretation of linear regression interaction term plot
Giving a talk in my old university, how prominently should I tell students my salary?
Why does a car's steering wheel get lighter with increasing speed
3.5% Interest Student Loan or use all of my savings on Tuition?
Was it really inappropriate to write a pull request for the company I interviewed with?
Having the player face themselves after the mid-game
Ruby deep nested hash from array
2019 Community Moderator ElectionCalling shell commands from RubyA concise explanation of nil v. empty v. blank in Ruby on RailsHow to write a switch statement in RubyHow to convert a string to lower or upper case in RubyCheck if a value exists in an array in Rubyclass << self idiom in RubyWhat is attr_accessor in Ruby?How to remove a key from Hash and get the remaining hash in Ruby/Rails?Why is it bad style to `rescue Exception => e` in Ruby?Access / process (nested) objects, arrays or JSON
I need to convert this array:
[:a, :b, :c, :d, :e]
Into this hash:
:a=>:b=>:c=>:d=>:e
Unfortunately, I'm missing the Recursion Lobe of the brain. I found BottomlessHash
# http://firedev.com/posts/2015/bottomless-ruby-hash/
class BottomlessHash < Hash
def initialize
super &-> h, k h[k] = self.class.new
end
end
While I'm struggling to understand the "pretzel stab", it does the trick if you write it out explicitly,
bhash = BottomlessHash.new
bhash[:a][:b][:c][:d] = :e
bhash # => :a=>:b=>:c=>:d=>:e
However I can't figure out a way to pass arbitrary values programmatically.
store
doesn't work, nor does send("[:a][:b][:c][:d]=", :e)
ruby recursion
add a comment |
I need to convert this array:
[:a, :b, :c, :d, :e]
Into this hash:
:a=>:b=>:c=>:d=>:e
Unfortunately, I'm missing the Recursion Lobe of the brain. I found BottomlessHash
# http://firedev.com/posts/2015/bottomless-ruby-hash/
class BottomlessHash < Hash
def initialize
super &-> h, k h[k] = self.class.new
end
end
While I'm struggling to understand the "pretzel stab", it does the trick if you write it out explicitly,
bhash = BottomlessHash.new
bhash[:a][:b][:c][:d] = :e
bhash # => :a=>:b=>:c=>:d=>:e
However I can't figure out a way to pass arbitrary values programmatically.
store
doesn't work, nor does send("[:a][:b][:c][:d]=", :e)
ruby recursion
1
What should be the result if the array has 0 or 1 elements?
– ndnenkov
2 days ago
What is your question?
– sawa
yesterday
add a comment |
I need to convert this array:
[:a, :b, :c, :d, :e]
Into this hash:
:a=>:b=>:c=>:d=>:e
Unfortunately, I'm missing the Recursion Lobe of the brain. I found BottomlessHash
# http://firedev.com/posts/2015/bottomless-ruby-hash/
class BottomlessHash < Hash
def initialize
super &-> h, k h[k] = self.class.new
end
end
While I'm struggling to understand the "pretzel stab", it does the trick if you write it out explicitly,
bhash = BottomlessHash.new
bhash[:a][:b][:c][:d] = :e
bhash # => :a=>:b=>:c=>:d=>:e
However I can't figure out a way to pass arbitrary values programmatically.
store
doesn't work, nor does send("[:a][:b][:c][:d]=", :e)
ruby recursion
I need to convert this array:
[:a, :b, :c, :d, :e]
Into this hash:
:a=>:b=>:c=>:d=>:e
Unfortunately, I'm missing the Recursion Lobe of the brain. I found BottomlessHash
# http://firedev.com/posts/2015/bottomless-ruby-hash/
class BottomlessHash < Hash
def initialize
super &-> h, k h[k] = self.class.new
end
end
While I'm struggling to understand the "pretzel stab", it does the trick if you write it out explicitly,
bhash = BottomlessHash.new
bhash[:a][:b][:c][:d] = :e
bhash # => :a=>:b=>:c=>:d=>:e
However I can't figure out a way to pass arbitrary values programmatically.
store
doesn't work, nor does send("[:a][:b][:c][:d]=", :e)
ruby recursion
ruby recursion
edited 2 days ago
ndnenkov
28.2k74981
28.2k74981
asked 2 days ago
JP DuffyJP Duffy
8431914
8431914
1
What should be the result if the array has 0 or 1 elements?
– ndnenkov
2 days ago
What is your question?
– sawa
yesterday
add a comment |
1
What should be the result if the array has 0 or 1 elements?
– ndnenkov
2 days ago
What is your question?
– sawa
yesterday
1
1
What should be the result if the array has 0 or 1 elements?
– ndnenkov
2 days ago
What should be the result if the array has 0 or 1 elements?
– ndnenkov
2 days ago
What is your question?
– sawa
yesterday
What is your question?
– sawa
yesterday
add a comment |
4 Answers
4
active
oldest
votes
[:a, :b, :c, :d, :e].reverse_each.inject k => h
# => :a=>:b=>:c=>:d=>:e
While this code may answer the question, providing additional context regarding how and/or why it solves the problem would improve the answer's long-term value.
– DebanjanB
yesterday
add a comment |
What send
does is call a method, just one, with zero or more arguments. It can't call multiple methods at once. Your example here:
send("[:a][:b][:c][:d]=", :e)
This is trying to call a method named, literally, [:a][:b][:b][:d]=
which doesn't exist, so the send
fails.
Now this bit of actual Ruby code:
x[:a][:b][:c][:d] = :e
Becomes interpreted by Ruby as:
x.send(:[], :a).send(:[], :b).send(:[], :c).send(:[]=, :d, :e)
Which is just a really long, ugly way of doing what the original code did. The key here is that each [...]
part represents a method call that returns something and then the next part is evaluated against that, or chained on.
Now for the original part, this pretzel-stab:
super &-> h, k h[k] = self.class.new
The &
means "pass through this Proc as a block argument", as in for a method with the signature:
initialize(&block)
Where &block
represents a block, if given, to that method, as in:
Hash.new h[k] =
In a more basic implementation.
The -> h, k ...
part is traditionally written as:
lambda ...
Where that's probably more recognizable.
add a comment |
array = [*:a..:e]
array[0..-2].reverse.reduce(array[-1]) a => b
# :a=>:b=>:c=>:d=>:e
add a comment |
items = [:a, :b, :c, :d, :e]
# Iterative version
def hashify(items)
items = items.dup
result = items.pop
result = items.pop => result until items.empty?
result
end
hashify(items) # => :a=>:b=>:c=>:d=>:e
# Recursive version
def hashify(items)
return items.last if items.size < 2
*head, penultimate, last = items
hashify(head + [penultimate => last])
end
hashify(items) # => :a=>:b=>:c=>:d=>:e
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55027514%2fruby-deep-nested-hash-from-array%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
4 Answers
4
active
oldest
votes
4 Answers
4
active
oldest
votes
active
oldest
votes
active
oldest
votes
[:a, :b, :c, :d, :e].reverse_each.inject k => h
# => :a=>:b=>:c=>:d=>:e
While this code may answer the question, providing additional context regarding how and/or why it solves the problem would improve the answer's long-term value.
– DebanjanB
yesterday
add a comment |
[:a, :b, :c, :d, :e].reverse_each.inject k => h
# => :a=>:b=>:c=>:d=>:e
While this code may answer the question, providing additional context regarding how and/or why it solves the problem would improve the answer's long-term value.
– DebanjanB
yesterday
add a comment |
[:a, :b, :c, :d, :e].reverse_each.inject k => h
# => :a=>:b=>:c=>:d=>:e
[:a, :b, :c, :d, :e].reverse_each.inject k => h
# => :a=>:b=>:c=>:d=>:e
answered yesterday
sawasawa
132k29205304
132k29205304
While this code may answer the question, providing additional context regarding how and/or why it solves the problem would improve the answer's long-term value.
– DebanjanB
yesterday
add a comment |
While this code may answer the question, providing additional context regarding how and/or why it solves the problem would improve the answer's long-term value.
– DebanjanB
yesterday
While this code may answer the question, providing additional context regarding how and/or why it solves the problem would improve the answer's long-term value.
– DebanjanB
yesterday
While this code may answer the question, providing additional context regarding how and/or why it solves the problem would improve the answer's long-term value.
– DebanjanB
yesterday
add a comment |
What send
does is call a method, just one, with zero or more arguments. It can't call multiple methods at once. Your example here:
send("[:a][:b][:c][:d]=", :e)
This is trying to call a method named, literally, [:a][:b][:b][:d]=
which doesn't exist, so the send
fails.
Now this bit of actual Ruby code:
x[:a][:b][:c][:d] = :e
Becomes interpreted by Ruby as:
x.send(:[], :a).send(:[], :b).send(:[], :c).send(:[]=, :d, :e)
Which is just a really long, ugly way of doing what the original code did. The key here is that each [...]
part represents a method call that returns something and then the next part is evaluated against that, or chained on.
Now for the original part, this pretzel-stab:
super &-> h, k h[k] = self.class.new
The &
means "pass through this Proc as a block argument", as in for a method with the signature:
initialize(&block)
Where &block
represents a block, if given, to that method, as in:
Hash.new h[k] =
In a more basic implementation.
The -> h, k ...
part is traditionally written as:
lambda ...
Where that's probably more recognizable.
add a comment |
What send
does is call a method, just one, with zero or more arguments. It can't call multiple methods at once. Your example here:
send("[:a][:b][:c][:d]=", :e)
This is trying to call a method named, literally, [:a][:b][:b][:d]=
which doesn't exist, so the send
fails.
Now this bit of actual Ruby code:
x[:a][:b][:c][:d] = :e
Becomes interpreted by Ruby as:
x.send(:[], :a).send(:[], :b).send(:[], :c).send(:[]=, :d, :e)
Which is just a really long, ugly way of doing what the original code did. The key here is that each [...]
part represents a method call that returns something and then the next part is evaluated against that, or chained on.
Now for the original part, this pretzel-stab:
super &-> h, k h[k] = self.class.new
The &
means "pass through this Proc as a block argument", as in for a method with the signature:
initialize(&block)
Where &block
represents a block, if given, to that method, as in:
Hash.new h[k] =
In a more basic implementation.
The -> h, k ...
part is traditionally written as:
lambda ...
Where that's probably more recognizable.
add a comment |
What send
does is call a method, just one, with zero or more arguments. It can't call multiple methods at once. Your example here:
send("[:a][:b][:c][:d]=", :e)
This is trying to call a method named, literally, [:a][:b][:b][:d]=
which doesn't exist, so the send
fails.
Now this bit of actual Ruby code:
x[:a][:b][:c][:d] = :e
Becomes interpreted by Ruby as:
x.send(:[], :a).send(:[], :b).send(:[], :c).send(:[]=, :d, :e)
Which is just a really long, ugly way of doing what the original code did. The key here is that each [...]
part represents a method call that returns something and then the next part is evaluated against that, or chained on.
Now for the original part, this pretzel-stab:
super &-> h, k h[k] = self.class.new
The &
means "pass through this Proc as a block argument", as in for a method with the signature:
initialize(&block)
Where &block
represents a block, if given, to that method, as in:
Hash.new h[k] =
In a more basic implementation.
The -> h, k ...
part is traditionally written as:
lambda ...
Where that's probably more recognizable.
What send
does is call a method, just one, with zero or more arguments. It can't call multiple methods at once. Your example here:
send("[:a][:b][:c][:d]=", :e)
This is trying to call a method named, literally, [:a][:b][:b][:d]=
which doesn't exist, so the send
fails.
Now this bit of actual Ruby code:
x[:a][:b][:c][:d] = :e
Becomes interpreted by Ruby as:
x.send(:[], :a).send(:[], :b).send(:[], :c).send(:[]=, :d, :e)
Which is just a really long, ugly way of doing what the original code did. The key here is that each [...]
part represents a method call that returns something and then the next part is evaluated against that, or chained on.
Now for the original part, this pretzel-stab:
super &-> h, k h[k] = self.class.new
The &
means "pass through this Proc as a block argument", as in for a method with the signature:
initialize(&block)
Where &block
represents a block, if given, to that method, as in:
Hash.new h[k] =
In a more basic implementation.
The -> h, k ...
part is traditionally written as:
lambda ...
Where that's probably more recognizable.
answered 2 days ago
tadmantadman
156k18178209
156k18178209
add a comment |
add a comment |
array = [*:a..:e]
array[0..-2].reverse.reduce(array[-1]) a => b
# :a=>:b=>:c=>:d=>:e
add a comment |
array = [*:a..:e]
array[0..-2].reverse.reduce(array[-1]) a => b
# :a=>:b=>:c=>:d=>:e
add a comment |
array = [*:a..:e]
array[0..-2].reverse.reduce(array[-1]) a => b
# :a=>:b=>:c=>:d=>:e
array = [*:a..:e]
array[0..-2].reverse.reduce(array[-1]) a => b
# :a=>:b=>:c=>:d=>:e
answered 2 days ago
Sebastian PalmaSebastian Palma
16k42035
16k42035
add a comment |
add a comment |
items = [:a, :b, :c, :d, :e]
# Iterative version
def hashify(items)
items = items.dup
result = items.pop
result = items.pop => result until items.empty?
result
end
hashify(items) # => :a=>:b=>:c=>:d=>:e
# Recursive version
def hashify(items)
return items.last if items.size < 2
*head, penultimate, last = items
hashify(head + [penultimate => last])
end
hashify(items) # => :a=>:b=>:c=>:d=>:e
add a comment |
items = [:a, :b, :c, :d, :e]
# Iterative version
def hashify(items)
items = items.dup
result = items.pop
result = items.pop => result until items.empty?
result
end
hashify(items) # => :a=>:b=>:c=>:d=>:e
# Recursive version
def hashify(items)
return items.last if items.size < 2
*head, penultimate, last = items
hashify(head + [penultimate => last])
end
hashify(items) # => :a=>:b=>:c=>:d=>:e
add a comment |
items = [:a, :b, :c, :d, :e]
# Iterative version
def hashify(items)
items = items.dup
result = items.pop
result = items.pop => result until items.empty?
result
end
hashify(items) # => :a=>:b=>:c=>:d=>:e
# Recursive version
def hashify(items)
return items.last if items.size < 2
*head, penultimate, last = items
hashify(head + [penultimate => last])
end
hashify(items) # => :a=>:b=>:c=>:d=>:e
items = [:a, :b, :c, :d, :e]
# Iterative version
def hashify(items)
items = items.dup
result = items.pop
result = items.pop => result until items.empty?
result
end
hashify(items) # => :a=>:b=>:c=>:d=>:e
# Recursive version
def hashify(items)
return items.last if items.size < 2
*head, penultimate, last = items
hashify(head + [penultimate => last])
end
hashify(items) # => :a=>:b=>:c=>:d=>:e
edited 2 days ago
answered 2 days ago
ndnenkovndnenkov
28.2k74981
28.2k74981
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55027514%2fruby-deep-nested-hash-from-array%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
What should be the result if the array has 0 or 1 elements?
– ndnenkov
2 days ago
What is your question?
– sawa
yesterday