Ruby Self & Attr, as a Python Dev

Picking up Ruby Fast, as a Python Dev (9 Part Series)

1 Picking up Ruby Fast, as a Python Dev
2 Picking up Ruby Fast, as a Python Dev pt II
5 more parts…
3 Picking up Ruby, as a Python Dev & interview questions
4 Picking up Ruby, as a Python Dev & a mini fish app
5 More Ruby from a Python Dev
6 Ruby Basics: Strings, Arrays, & Hashes, oh my! (and cute things)
7 *, ?, and yield in Ruby, as a Python Dev
8 Ruby Variables & Objects, as a Python Dev
9 Ruby Self & Attr, as a Python Dev

This is a continuation of Picking up Ruby Fast, as a Python Dev. Again, expect examples with pets and minimal math


What is self

self is a method called on the class itself. It can be done in a couple of different ways. The first is similar to Python. The second with the << is new to me.

In these examples, I’m just gonna add 1 to a count of how many dog or cat instances we’ve created.

self.

words

<span>class</span> <span>Dog</span>
<span>@@num_dogs</span> <span>=</span> <span>0</span>
<span>def</span> <span>initialize</span>
<span>@@num_dogs</span> <span>+=</span> <span>1</span>
<span>end</span>
<span>def</span> <span>self</span><span>.</span><span>num_monkeys</span>
<span>@@num_dogs</span>
<span>end</span>
<span>end</span>
<span># to get the num of dogs</span>
<span>self</span><span>.</span><span>num_dogs</span>
<span>class</span> <span>Dog</span>
    <span>@@num_dogs</span> <span>=</span> <span>0</span>

    <span>def</span> <span>initialize</span>
        <span>@@num_dogs</span> <span>+=</span> <span>1</span>
    <span>end</span>

    <span>def</span> <span>self</span><span>.</span><span>num_monkeys</span>
        <span>@@num_dogs</span>
    <span>end</span>
<span>end</span>

<span># to get the num of dogs</span>
<span>self</span><span>.</span><span>num_dogs</span>
class Dog @@num_dogs = 0 def initialize @@num_dogs += 1 end def self.num_monkeys @@num_dogs end end # to get the num of dogs self.num_dogs

Enter fullscreen mode Exit fullscreen mode

class << self

In this example, the class << self is saying that everything before the end is a class method and is not for the instances.

<span>class</span> <span>Cat</span>
<span>@@num_cats</span> <span>=</span> <span>0</span>
<span>def</span> <span>initialize</span>
<span>@@num_cats</span> <span>+=</span> <span>1</span>
<span>end</span>
<span>class</span> <span><<</span> <span>self</span>
<span>def</span> <span>num_cats</span>
<span>@@num_cats</span>
<span>end</span>
<span>end</span>
<span>end</span>
<span># to get the num of cats</span>
<span>Cat</span><span>.</span><span>num_cats</span>
<span>class</span> <span>Cat</span>
    <span>@@num_cats</span> <span>=</span> <span>0</span>

    <span>def</span> <span>initialize</span>
        <span>@@num_cats</span> <span>+=</span> <span>1</span>
    <span>end</span>

    <span>class</span> <span><<</span> <span>self</span>
        <span>def</span> <span>num_cats</span>
            <span>@@num_cats</span>
        <span>end</span>
    <span>end</span>
<span>end</span>

<span># to get the num of cats</span>
<span>Cat</span><span>.</span><span>num_cats</span>
class Cat @@num_cats = 0 def initialize @@num_cats += 1 end class << self def num_cats @@num_cats end end end # to get the num of cats Cat.num_cats

Enter fullscreen mode Exit fullscreen mode

attr

We can use the following to easily read, write, and grab attributes of a class: attr_reader, attr_writer, and attr_accessor. They all automatically create methods that do things to keep us from having to write so many methods.

Giving a symbol to attr_reader automatically makes a method by the name of the symbol that will read the instance variable by the same name.

attr_writer will automatically create a method ending with an = with will then write/set the symbol’s instance variable to the value given.

attr_accessor is the best of both worlds and it automatically creates methods to read and write. Again, it uses the name of the symbol given.

The example below shows a Kitty class with these different attr things.

<span>class</span> <span>Kitty</span>
<span>attr_accessor</span> <span>:name</span> <span># creates method to read/get & write/set the instance variable</span>
<span>attr_reader</span> <span>:lives_remaining</span> <span># creates method to read/get the instance variable</span>
<span>def</span> <span>initialize</span> <span>name</span>
<span>@name</span> <span>=</span> <span>name</span>
<span>@lives_remaining</span> <span>=</span> <span>9</span>
<span>end</span>
<span>end</span>
<span># irb and output</span>
<span>irb</span><span>(</span><span>main</span><span>):</span><span>003</span><span>:</span><span>0</span><span>></span> <span>cat_1</span> <span>=</span> <span>Kitty</span><span>.</span><span>new</span><span>(</span><span>'Mouse'</span><span>)</span>
<span>=></span> <span>#<Kitty:0x00007fa04e956f50 @name="Mouse", @lives_remaining=9></span>
<span>class</span> <span>Kitty</span>
    <span>attr_accessor</span> <span>:name</span>  <span># creates method to read/get & write/set the instance variable</span>
    <span>attr_reader</span> <span>:lives_remaining</span>  <span># creates method to read/get the instance variable</span>

    <span>def</span> <span>initialize</span> <span>name</span>
        <span>@name</span> <span>=</span> <span>name</span>
        <span>@lives_remaining</span> <span>=</span> <span>9</span>
    <span>end</span>
<span>end</span>

<span># irb and output</span>
<span>irb</span><span>(</span><span>main</span><span>):</span><span>003</span><span>:</span><span>0</span><span>></span> <span>cat_1</span> <span>=</span> <span>Kitty</span><span>.</span><span>new</span><span>(</span><span>'Mouse'</span><span>)</span>
<span>=></span> <span>#<Kitty:0x00007fa04e956f50 @name="Mouse", @lives_remaining=9></span>
class Kitty attr_accessor :name # creates method to read/get & write/set the instance variable attr_reader :lives_remaining # creates method to read/get the instance variable def initialize name @name = name @lives_remaining = 9 end end # irb and output irb(main):003:0> cat_1 = Kitty.new('Mouse') => #<Kitty:0x00007fa04e956f50 @name="Mouse", @lives_remaining=9>

Enter fullscreen mode Exit fullscreen mode


More New Stuff that I Never Saw in Python

Every time I see something new-to-me in Ruby I wonder if it’s because I never came across it in Python or because Ruby just has all sort of cool stuff that Python doesn’t have.

method_name=

Turns out method names can not only end with question marks, but they can also end with equal signs.

Ending a method with an =, Ruby reads it as “this method is going to change the value of something”

In this example, we have a Cat class. We’re going to create a new cat. Then, we are going to rename that cat.

<span>class</span> <span>Cat</span>
<span>def</span> <span>initialize</span> <span>name</span>
<span>@name</span> <span>=</span> <span>name</span>
<span>end</span>
<span>def</span> <span>name</span><span>=</span> <span>new_name</span>
<span>@name</span> <span>=</span> <span>new_name</span>
<span>end</span>
<span>end</span>
<span># output</span>
<span>irb</span><span>(</span><span>main</span><span>):</span><span>005</span><span>:</span><span>0</span><span>></span> <span>cat_one</span> <span>=</span> <span>Cat</span><span>.</span><span>new</span> <span>'Blocks'</span>
<span>irb</span><span>(</span><span>main</span><span>):</span><span>012</span><span>:</span><span>0</span><span>></span> <span>cat_one</span>
<span>=></span> <span>#<Cat:0x00007ff6948b19a0 @name="Blocks"></span>
<span>irb</span><span>(</span><span>main</span><span>):</span><span>013</span><span>:</span><span>0</span><span>></span> <span>cat_one</span><span>.</span><span>name</span> <span>=</span> <span>"Socks"</span>
<span>=></span> <span>"Socks"</span>
<span>irb</span><span>(</span><span>main</span><span>):</span><span>014</span><span>:</span><span>0</span><span>></span> <span>cat_one</span>
<span>=></span> <span>#<Cat:0x00007ff6948b19a0 @name="Socks"></span>
<span>class</span> <span>Cat</span>
    <span>def</span> <span>initialize</span> <span>name</span>
        <span>@name</span> <span>=</span> <span>name</span>
    <span>end</span>

    <span>def</span> <span>name</span><span>=</span> <span>new_name</span>
        <span>@name</span> <span>=</span> <span>new_name</span>
    <span>end</span>
<span>end</span>

<span># output</span>
<span>irb</span><span>(</span><span>main</span><span>):</span><span>005</span><span>:</span><span>0</span><span>></span> <span>cat_one</span> <span>=</span> <span>Cat</span><span>.</span><span>new</span> <span>'Blocks'</span> 
<span>irb</span><span>(</span><span>main</span><span>):</span><span>012</span><span>:</span><span>0</span><span>></span> <span>cat_one</span>
<span>=></span> <span>#<Cat:0x00007ff6948b19a0 @name="Blocks"></span>
<span>irb</span><span>(</span><span>main</span><span>):</span><span>013</span><span>:</span><span>0</span><span>></span> <span>cat_one</span><span>.</span><span>name</span> <span>=</span> <span>"Socks"</span>
<span>=></span> <span>"Socks"</span>
<span>irb</span><span>(</span><span>main</span><span>):</span><span>014</span><span>:</span><span>0</span><span>></span> <span>cat_one</span>
<span>=></span> <span>#<Cat:0x00007ff6948b19a0 @name="Socks"></span>
class Cat def initialize name @name = name end def name= new_name @name = new_name end end # output irb(main):005:0> cat_one = Cat.new 'Blocks' irb(main):012:0> cat_one => #<Cat:0x00007ff6948b19a0 @name="Blocks"> irb(main):013:0> cat_one.name = "Socks" => "Socks" irb(main):014:0> cat_one => #<Cat:0x00007ff6948b19a0 @name="Socks">

Enter fullscreen mode Exit fullscreen mode


Reminder To Self (haha, get it :D)

  1. Use irb in terminal to get IRB. I keep getting this mixed up because Python uses python to get REPL.

If you missed the first post in this series, I’ve heard it’s a good read and there’s cats.

图片[1]-Ruby Self & Attr, as a Python Dev - 拾光赋-拾光赋

Picking up Ruby Fast, as a Python Dev

Vicki Langer ・ Nov 12 ’20

#ruby #python #codenewbie

Picking up Ruby Fast, as a Python Dev (9 Part Series)

1 Picking up Ruby Fast, as a Python Dev
2 Picking up Ruby Fast, as a Python Dev pt II
5 more parts…
3 Picking up Ruby, as a Python Dev & interview questions
4 Picking up Ruby, as a Python Dev & a mini fish app
5 More Ruby from a Python Dev
6 Ruby Basics: Strings, Arrays, & Hashes, oh my! (and cute things)
7 *, ?, and yield in Ruby, as a Python Dev
8 Ruby Variables & Objects, as a Python Dev
9 Ruby Self & Attr, as a Python Dev

原文链接:Ruby Self & Attr, as a Python Dev

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
Nobody can go back and start a new beginning, but anyone can start today and make a new ending.
没有人可以回到过去从头再来,但是每个人都可以从今天开始,创造一个全新的结局
评论 抢沙发

请登录后发表评论

    暂无评论内容