Skip to main content

Ruby - 'reduce' or 'inject' applying a string function, a quick code snippet example

I was getting my head around the reduce method (also known as inject) in Ruby for some code I am writing. I suspected that this would be what I really wanted to use with my array instead of the more generic each which first sprang to mind.

So I was eager to try out the concept with reduce and ready to code a quick separate sketch of the outline for my particular use case. However, most examples of reduce out there are mathematical in nature and this makes it harder to mentally translate to string use examples. 

In my case, I'm using the string to stand in for a more complex data structure, so I didn't want to have to mentally translate from numbers to strings to higher order structures.

The Ruby documentation for reduce/inject was thorough but I struggled to wrap my head around their terminology, especially the word "memo". I finally realized that "memo" simply means the changing result. That seemed to do the trick mentally. 

Since most of the functions in my particular project return the updated state of a data structure, that (the data structure) is generally what I want to be passing as "memo". So here is my code, so that I can find it easily if I need to refer to it again:

def changetext(startstr, addeditem)
  startstr + addeditem
end

arr1 = ["a", "b", "c", "d", "e", "f", "g"]
str1 = "Abstract"

newstring = arr1.reduce(str1){|changing, arritem| changetext(changing, arritem)}
puts newstring

This code displays:

Abstractabcdefg

More info

The str1 as the parameter in arr1.reduce indicates the initial value of the changing result. 

The changing parameter in the block could really be called anything, but I liked calling it changing to make it clear to myself that it gets updated with each application of an array item. And to put it together, changing should be thought of as "the thing that started out as str1 but got changed along the way".

Funnily enough, once I got my head around using reduce in this way, I tried as an exercise to compare it with an implementation using each instead for the sake of comparison, but now I couldn't figure out how to do it with each any more!

Further reading

James Hughes, 2017. Using the 'reduce' method in Ruby at Medium.com

D. Flaherty. Getting to know Ruby's Map and Reduce at flats.github.io

Popular posts from this blog

How to center images horizontally using Grav

I've been playing around a bit with Grav. I was posing the question to myself: for the relatively simple use-cases I'm dealing with, could it possibly work for my purposes as an alternative to ProcessWire?  The problem I was initially dismayed to find that Grav uses Markdown as its editor, which does not offer native support for horizontal centering of anything (text or images). However, Grav offers some tweaks that help make it easier to do specific things you might commonly want to do. I tried writing a sample article, and I found that one of the hardest things to do was to center an image horizontally. And horizontal centering of images is something I would typically do in most of the articles I would write. So the lack of easy horizontal centering is a highly significant drawback IMHO (most people do want to center images in an article!) However, this issue is made up for by other things in Grav: the relative speed, ease and flexibility of custom theming and built-in suppor...

Life using the Linux operating system exclusively for the last few years

Above: my Linux desktop layout. Back in 2017, I switched my operating system entirely to Linux. In case anyone is wondering, here is what I experienced over the last few years. Others I interact with have no idea I'm on Linux. For example, if someone emails me an MS Word document that I need to complete, I simply open it with LibreOffice (an open-source word processing program that is pre-installed on most Linux systems), edit the document as needed - which is very easy since the same sorts of functionalities are available in LibreOffice - and then I can save it in MS Word format and email it back. Likewise, if I'm on a Zoom call, everything works just the way it does on PC and Mac. Zoom makes their application available for Linux too, I downloaded it and let it self-install, and it works exactly the same way as it does on other operating systems. I can point-and-click my way to whatever I need to do on Linux; no special knowledge required. If you want to dig deeper into script...

Good and bad uses of AI as it currently stands

The good Recently, the Photos app on my Android phone automatically curated some of my photos into a "highlights" album for me. I thought this was a fantastic idea. I love this use of AI - it does something quickly and easily that would otherwise take a lot of human time.  The only downside was that the AI included a close-up pic I'd taken of a spot on the skin behind my husband's ear so he could see it. Now, if this AI had instead been for a self-driving car, then too bad, we likely would've had a terrible wreck at this point - endangering myself, any passengers, and other drivers on the road. But since this application of AI for photo selection did not have any life-threatening consequences, I was all for it. The bad I've said before, and I'll say it again, that AI as it currently stands should not be used for self-driving purposes and I have explained clearly why. Indeed, I believe that AI should not be used for any purpose that may have life-threaten...

About Me

My photo
Vera
I'm a wife and mother. I don't have any formal computer science qualifications, or any religious qualifications. I have a PhD in biochemistry. This photo is of me, but is confusing for AI.