Ruby 〜Rangeオブジェクト覚書〜

Rangeオブジェクトについて

Rangeオブジェクトとは、ある値の範囲を扱うオブジェクト。
例:1から3の範囲の表し方

irb(main):001:0> 1..3
=> 1..3
irb(main):002:0> (1..3).class
=> Range
irb(main):003:0> 

to_aメソッドで表示するとより分かりやすい

irb(main):003:0> (1..3).to_a
=> [1, 2, 3]
irb(main):004:0> 

またドットを3つにすることで最後の数字を含まなくする事もできる

irb(main):004:0> (1...3).to_a
=> [1, 2]
irb(main):005:0> 

アルファベットの並びをRangeで表示する

irb(main):006:0> ('a'..'h').to_a
=> ["a", "b", "c", "d", "e", "f", "g", "h"]
irb(main):007:0> 

eachメソッドの使用例

irb(main):009:0> (1..31).each { |day| puts "#{day}日"}
1日
2日
3日
4日
5日
6日
7日
8日
9日
10日
11日
12日
13日
14日
15日
16日
17日
18日
19日
20日
21日
22日
23日
24日
25日
26日
27日
28日
29日
30日
31日
=> 1..31
irb(main):010:0> 

Ruby 〜Hashオブジェクト覚書〜

Hashオブジェクトについて

Hashオブジェクトはキーとバリューの組み合わせでデータ表現できるオブジェクト
通常Hashオブジェクトを使うには{}中括弧を使う。

irb(main):011:0> user1 = { name:'一郎'}
=> {:name=>"一郎"}
irb(main):012:0> user2 = { id: 2 ,name: '二郎'}
=> {:id=>2, :name=>"二郎"}
irb(main):013:0> 

Hashオブジェクトから任意の値を取り出す方法

=> {:id=>2, :name=>"二郎"}
irb(main):013:0> user1[:name]
=> "一郎"
irb(main):014:0> user2[:name]
=> "二郎"
irb(main):015:0> user2[:id]
=> 2
irb(main):016:0> 

ただし上記書き方だとキーをString型で指定できないの注意が必要。

irb(main):016:0> user1['name']
=> nil
irb(main):017:0> 

キーをStringで書きたい場合は次のように書く。

irb(main):017:0> user3 = { 'id'=>3,'name'=>'三郎'}
=> {"id"=>3, "name"=>"三郎"}
irb(main):018:0> user3['id']
=> 3
irb(main):019:0> user3['name']
=> "三郎"
irb(main):020:0> 

階層構造でHashオブジェクトの作成について

irb(main):021:0> user4 = {
irb(main):022:1*  name: '四郎',
irb(main):023:1*  test_results: {
irb(main):024:2*   math: 70,
irb(main):025:2*   science: 80
irb(main):026:2>  }
irb(main):027:1> }
=> {:name=>"四郎", :test_results=>{:math=>70, :science=>80}}
irb(main):028:0> user4[:test_results][:math]
=> 70
irb(main):029:0> 

値の書き換えについて

irb(main):032:0> user4[:test_results][:math] = 90
=> 90
irb(main):033:0> user4
=> {:name=>"四郎", :test_results=>{:math=>90, :science=>80}}
irb(main):034:0> 

keys/valuesメソッドについて

Hashオブジェクトではkeysメソッドでキーの配列を取得でき、valuesメソッドで値の配列を取得できる

irb(main):034:0> user4.keys
=> [:name, :test_results]
irb(main):035:0> user4.values
=> ["四郎", {:math=>90, :science=>80}]
irb(main):036:0> 

Hashオブジェクトでのeachメソッドの使い方

irb(main):040:0> user4.each do | k,v|
irb(main):041:1*  puts "#{k} = #{v}"
irb(main):042:1> end
name = 四郎
test_results = {:math=>90, :science=>80}
=> {:name=>"四郎", :test_results=>{:math=>90, :science=>80}}
irb(main):043:0> 

一部のキーやバリューの値削除について

deleteメソッドで第一引数に削除対象のキーを指定する

irb(main):044:0> user4.delete(:test_results)
=> {:math=>90, :science=>80, :name=>90}
irb(main):045:0> user4
=> {:name=>"四郎"}
irb(main):046:0> 

Docker内のゲストサーバの内部IPアドレスを調べる

先日Dockerを使って2台のゲストサーバを構築しました。
そこからAnsibleを使ってちょこちょこ弄ろうと思った矢先にゲストサーバのIPアドレスなんだっけ?
ってなったのでご紹介します。

コンテナのIDを確認

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
76d2910cfb5a        centos              "/sbin/init"        5 days ago          Up 5 days                               centos2
090777c53f98        centos              "/sbin/init"        5 days ago          Up 5 days                               centos
$ 

コンテナにログインし、IPアドレスの確認

$ docker exec -it 090777c53f98 /bin/bash 
[root@090777c53f98 /]# hostname -i
172.16.0.10
[root@090777c53f98 /]# 

おまけ

ちなみにもう一個立てたゲストサーバのIPも確認して対向のゲストサーバへPing疎通を行うと問題なく疎通できましたね。

$ docker exec -it 76d2910cfb5a /bin/bash 
[root@76d2910cfb5a /]# hostname -i
172.16.0.11
[root@76d2910cfb5a /]# ping 172.16.0.10
PING 172.16.0.10 (172.16.0.10) 56(84) bytes of data.
64 bytes from 172.16.0.10: icmp_seq=1 ttl=64 time=0.164 ms
64 bytes from 172.16.0.10: icmp_seq=2 ttl=64 time=0.185 ms
^C
--- 172.16.0.10 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1065ms
rtt min/avg/max/mdev = 0.164/0.174/0.185/0.016 ms
[root@76d2910cfb5a /]# 

Docker入手からCentos7の起動までやってみる

DockekでCentOS立てようとずっと思っていてやっと今日その機会がやってきました。
なんかお袈裟なこと言ってますが、やる気スイッチが入らなかっただけです(笑)
では早速Dockerのインストールから行ってみよう〜

Dockerの入手とインストール

ここから入手www.docker.com
Mac用やWindows用があるので自分のマシンに適したものをダウンロードしてくださいね。

インストールは他のアプリケーションと同じなので割愛します。
インストール後に起動してログインしましょう。するとPC画面上部バーにDockerのアイコンが出てきます。

Dockerのインストール確認

Dockerをインストールし、画面上部バーにDockerアイコンが表示されましたらDockerコマンドが使えるか確認してみましょう。
ターミナルで「docker version」と打ってみましょう。

$ docker version
Client: Docker Engine - Community
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:39 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     false
$ 

DockerからCentoOSのイメージを取得

ターミナルから次のコマンドでCentOSのイメージを取得します。
「docker pull centos
イメージ取得後次のコマンドで取得できているか確認します。
「docker images」

$ docker pull centos
Using default tag: latest
latest: Pulling from library/centos
8ba884070f61: Pull complete 
Digest: sha256:8d487d68857f5bc9595793279b33d082b03713341ddec91054382641d14db861
Status: Downloaded newer image for centos:latest
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              9f38484d220f        2 days ago          202MB
$ 

Dockerのネットワーク帯を決める。

今回は172.16.0.0/24の空間で作成。

$ docker network create --subnet=172.16.0.0/24 net0
e16ea1d70d11aad621fa4ac660751e1f97d9e7262653c8e9f2861adebb38e9be
$

CentOSの起動

次のコマンドでCentOSを起動します。
「docker run -it -d --privileged --net=net0 --ip=172.16.0.10 --name centos centos /sbin/init」
次のコマンドでOS起動確認を行います。
「docker ps」

$ docker run -it -d --privileged --net=net0 --ip=172.16.0.10 --name centos centos /sbin/init
090777c53f9889414e678823826231bae28c0c0961d267192adeb6b4e1414995
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
090777c53f98        centos              "/sbin/init"        17 seconds ago      Up 14 seconds                           centos
$

CentOS7にログインする

$ docker exec -it 090777c53f98 /bin/bash 
[root@090777c53f98 /]# 
[root@090777c53f98 /]# 
[root@090777c53f98 /]# cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

[root@090777c53f98 /]#    

おまけ

httpdサービスのインストールをやってみましたが、問題なくインストールされていますね。

[root@090777c53f98 /]# yum install -y httpd
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: mirrors.cat.net
 * extras: mirrors.cat.net
 * updates: mirrors.cat.net
base                                                                                   | 3.6 kB  00:00:00     
extras                                                                                 | 3.4 kB  00:00:00     
updates                                                                                | 3.4 kB  00:00:00     
(1/4): base/7/x86_64/group_gz                                                          | 166 kB  00:00:00     
(2/4): extras/7/x86_64/primary_db                                                      | 180 kB  00:00:00     
(3/4): updates/7/x86_64/primary_db                                                     | 2.5 MB  00:00:00     
(4/4): base/7/x86_64/primary_db                                                        | 6.0 MB  00:00:01     
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.4.6-88.el7.centos will be installed
--> Processing Dependency: httpd-tools = 2.4.6-88.el7.centos for package: httpd-2.4.6-88.el7.centos.x86_64
--> Processing Dependency: system-logos >= 7.92.1-1 for package: httpd-2.4.6-88.el7.centos.x86_64
--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-88.el7.centos.x86_64
--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-88.el7.centos.x86_64
--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-88.el7.centos.x86_64
--> Running transaction check
---> Package apr.x86_64 0:1.4.8-3.el7_4.1 will be installed
---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed
---> Package centos-logos.noarch 0:70.0.6-3.el7.centos will be installed
---> Package httpd-tools.x86_64 0:2.4.6-88.el7.centos will be installed
---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==============================================================================================================
 Package                    Arch                 Version                             Repository          Size
==============================================================================================================
Installing:
 httpd                      x86_64               2.4.6-88.el7.centos                 base               2.7 M
Installing for dependencies:
 apr                        x86_64               1.4.8-3.el7_4.1                     base               103 k
 apr-util                   x86_64               1.5.2-6.el7                         base                92 k
 centos-logos               noarch               70.0.6-3.el7.centos                 base                21 M
 httpd-tools                x86_64               2.4.6-88.el7.centos                 base                90 k
 mailcap                    noarch               2.1.41-2.el7                        base                31 k

Transaction Summary
==============================================================================================================
Install  1 Package (+5 Dependent packages)

Total download size: 24 M
Installed size: 31 M
Downloading packages:
warning: /var/cache/yum/x86_64/7/base/packages/apr-util-1.5.2-6.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for apr-util-1.5.2-6.el7.x86_64.rpm is not installed
(1/6): apr-util-1.5.2-6.el7.x86_64.rpm                                                 |  92 kB  00:00:00     
(2/6): apr-1.4.8-3.el7_4.1.x86_64.rpm                                                  | 103 kB  00:00:00     
(3/6): httpd-tools-2.4.6-88.el7.centos.x86_64.rpm                                      |  90 kB  00:00:00     
(4/6): mailcap-2.1.41-2.el7.noarch.rpm                                                 |  31 kB  00:00:00     
(5/6): httpd-2.4.6-88.el7.centos.x86_64.rpm                                            | 2.7 MB  00:00:01     
(6/6): centos-logos-70.0.6-3.el7.centos.noarch.rpm                                     |  21 MB  00:00:03     
--------------------------------------------------------------------------------------------------------------
Total                                                                         6.5 MB/s |  24 MB  00:00:03     
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
 Userid     : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
 Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
 Package    : centos-release-7-6.1810.2.el7.centos.x86_64 (@CentOS)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : apr-1.4.8-3.el7_4.1.x86_64                                                                 1/6 
  Installing : apr-util-1.5.2-6.el7.x86_64                                                                2/6 
  Installing : httpd-tools-2.4.6-88.el7.centos.x86_64                                                     3/6 
  Installing : centos-logos-70.0.6-3.el7.centos.noarch                                                    4/6 
  Installing : mailcap-2.1.41-2.el7.noarch                                                                5/6 
  Installing : httpd-2.4.6-88.el7.centos.x86_64                                                           6/6 
  Verifying  : mailcap-2.1.41-2.el7.noarch                                                                1/6 
  Verifying  : apr-util-1.5.2-6.el7.x86_64                                                                2/6 
  Verifying  : httpd-tools-2.4.6-88.el7.centos.x86_64                                                     3/6 
  Verifying  : httpd-2.4.6-88.el7.centos.x86_64                                                           4/6 
  Verifying  : apr-1.4.8-3.el7_4.1.x86_64                                                                 5/6 
  Verifying  : centos-logos-70.0.6-3.el7.centos.noarch                                                    6/6 

Installed:
  httpd.x86_64 0:2.4.6-88.el7.centos                                                                          

Dependency Installed:
  apr.x86_64 0:1.4.8-3.el7_4.1                           apr-util.x86_64 0:1.5.2-6.el7                        
  centos-logos.noarch 0:70.0.6-3.el7.centos              httpd-tools.x86_64 0:2.4.6-88.el7.centos             
  mailcap.noarch 0:2.1.41-2.el7                         

Complete!
[root@090777c53f98 /]# 

終わり

どうでしたでしょうか?
すごく簡単にCentOSを立てることができたと思います。
VirtualBoxVMwareより余程簡単にCentOSを用意できるのでこれは凄いです!
ちょうどAnsibleの動作確認したいと思っていたので、この環境を使ってみたいと思います。

Ruby 〜Arrayオブジェクト覚書〜

Arrayとは

Arrayは一般的に配列とも呼ばれ、開発で頻繁に使われる重要なオベジェクトで
複数のオブジェクトを格納できるオブジェクトです。

Arrayオブジェクトの生成
[1] pry(main)> []
=> []
[2] pry(main)> [1,2,3]
=> [1, 2, 3]
[3] pry(main)> [1,'文字',1.5]
=> [1, "文字", 1.5]
[4] pry(main)> 

[1]が空のArrayオブジェクトの生成
[2]が複数個の整数値を格納したArrayオブジェクトの生成
[3]が異なる複数のオブジェクトを格納したArrayオブジェクトの生成
また、配列内の「,」で区切ったものを「要素と呼ぶ」
イメージ ⇨ { 要素1 , 要素2 , 要素3 }

要素の追加
[4] pry(main)> arry = []
=> []
[5] pry(main)> arry.push('一つ目')
=> ["一つ目"]
[6] pry(main)> arry << '二つ目'
=> ["一つ目", "二つ目"]
[7] pry(main)> 
%記法について
[7] pry(main)> ['文','字']
=> ["文", "字"]
[8] pry(main)> %w[文 字]
=> ["文", "字"]
[9] pry(main)> 

[7]と[8]は同じ動作結果であるが、書き方が異なる。[8]が%記法と呼ばれる書き方である。
[8]の%wの場合、要素と要素をスペースで区切ることで結果として要素をダブルクオートで囲われたArrayオブジェクトが生成される。
は別の記号を使用できるが、規約的にブラケットを使用することが推奨されている。
参考までに別の記号での書き方は以下の通りである。

[9] pry(main)> %w!文 字!
=> ["文", "字"]
[10] pry(main)> %w(文 字)
=> ["文", "字"]
[11] pry(main)> 

また、%wの「w」を大文字にすることで変数を展開すること出来る。

[11] pry(main)> one = 1
=> 1
[12] pry(main)> two = 2
=> 2
[13] pry(main)> %W[a#{one},b#{two}]
=> ["a1,b2"]
[14] pry(main)> 
Symbolを作る%記法について
[14] pry(main)> %i[a b c]
=> [:a, :b, :c]
[15] pry(main)> 
配列での繰り返し処理について

eachオブジェクトを使用することで配列の中身を取り出して処理することが出来る。

[15] pry(main)> %w[あ い う].each do |str|
[15] pry(main)*   puts str
[15] pry(main)* end  
あ
い
う
=> ["あ", "い", "う"]
[16] pry(main)>

また、繰り返しの処理は「break」を書くことで途中終了させる事が出来る。

[16] pry(main)> %w[あ い う].each do |str|
[16] pry(main)*   break if str == 'う'
[16] pry(main)*   puts str
[16] pry(main)* end  
あ
い
=> nil
[17] pry(main)> 

繰り返し処理で一部スキップ処理をさせたい場合は「next」を使用する。

[17] pry(main)> %w[あ い う].each do |str|
[17] pry(main)*   next if str == 'い'
[17] pry(main)*   puts str
[17] pry(main)* end  
あ
う
=> ["あ", "い", "う"]
[18] pry(main)> 

mapメソッドを使う事で各要素を加工した配列を生成する事が出来る。

[18] pry(main)> %w[あ い う].map { |str| "(#{str})" }
=> ["(あ)", "(い)", "(う)"]
[19] pry(main)> 
多重代入について

別々の変数に値を代入する事が可能。

[19] pry(main)> foo, bar = [1,2]
=> [1, 2]
[20] pry(main)> foo
=> 1
[21] pry(main)> bar
=> 2

もし用意した変数と代入値が異なる場合は以下のようになる。
用意した変数 > 代入値 ⇨ 代入値がない変数には「nil」が代入される。
nil」は値無しの意味である。
用意した変数 < 代入値 ⇨ 代入されなかった値は無視される。

[22] pry(main)> foo,bar = 1
=> 1
[23] pry(main)> foo
=> 1
[24] pry(main)> bar
=> nil
[25] pry(main)> foo,bar = [1,2,3]
=> [1, 2, 3]
[26] pry(main)> foo
=> 1
[27] pry(main)> bar
=> 2
[28] pry(main)> 

以上Ruby Arrayオブジェクト覚書でした〜

Ruby 〜Integer,Float,Enumeratorオブジェクト覚書〜

Ruby Integer,Float,Enumeratorについて

四則演算

足し算、引き算、掛け算、割り算について

[1] pry(main)> 1 + 1
=> 2
[2] pry(main)> 2 - 1
=> 1
[3] pry(main)> 100 * 1.08
=> 108.0
[4] pry(main)> 4 / 2
=> 2
[5] pry(main)> 

・ちょこっとメモ
IntegerとFloatで行なった計算結果はFloatオベジェクトとなる。

[5] pry(main)> (1 + 1.0).class
=> Float
[6] pry(main)> 

剰余、冪乗について

[6] pry(main)> 5 % 2
=> 1
[7] pry(main)> 5 ** 2
=> 25
[8] pry(main)> 

小数点以下の四捨五入や切り上げ、切り下げについて
四捨五入 ⇨ roundメソッド
切り上げ ⇨ ceilメソッド
切り下げ ⇨ floorメソッド

[8] pry(main)> 1.5.round
=> 2
[9] pry(main)> 1.4.round
=> 1
[10] pry(main)> 1.1.ceil
=> 2
[11] pry(main)> 1.1.floor
=> 1
[12] pry(main)> 
Enumeratorについて

Integerオブジェクトはtimesメソッドを使う事でEnumeratorオブジェクトを生成する。
Enumeratorオブジェクトを使用することで指定回数同じ処理を繰り返すことが出来る。

[12] pry(main)> 3.times
=> #<Enumerator: ...>
[13] pry(main)> 3.times do |i|
[13] pry(main)*   puts i
[13] pry(main)* end  
0
1
2
=> 3
[14] pry(main)> 

・ちょこっとメモ
do endのブロックは他の書き方でも動作できる。

[14] pry(main)> 3.times { |i| puts i }
0
1
2
=> 3
[15] pry(main)> 

以上Ruby Integer,Float,Enumeratorについての覚書でした〜

Ruby 〜Stringオベジェクト覚書編〜

RubyのStringオブジェクトについて

文字列を扱うオブジェクトでシングルクオートかダブルクオートで囲んだ文字列がStringオベジェクト

$ pry
[1] pry(main)> '文字'
=> "文字"
[2] pry(main)> "文字"
=> "文字"
[3] pry(main)> 

Stringオブジェクトのクラスの確認

[4] pry(main)> '文字'.class
=> String
[5] pry(main)> 

Stringクラスの機能について

upcaseメソッド(小文字を大文字に変換する)

※メソッドとは特定の処理を行う機能のこと

[6] pry(main)> 'sample'.upcase
=> "SAMPLE"
[7] pry(main)> 

ちょこっとメモ
Rubyは()を省略できる。

[8] pry(main)> 'sample'.upcase()
=> "SAMPLE"
[9] pry(main)> 'sample'.upcase
=> "SAMPLE"
[10] pry(main)> 

Rubyの場合は引数がない場合は()を付けないのが好ましい

sliceメソッド(文字の切り出し)
[12] pry(main)> '文字列です。'.slice(0,3)
=> "文字列"
[13] pry(main)> 

sliceメソッドに引数を渡しました。
ここでの第一引数の「0」はシングルクオートで囲った文字列の1つ目を指し、
第二引数は第一引数からどこまでを切り出すかの値を指す。
つまり、(0,3)とは「文字列」の3文字が切り出されます。

downcaseメソッド(大文字から小文字変換)
[14] pry(main)> 'SAMPLE'.downcase
=> "sample"
[15] pry(main)> 
sizeメソッド(文字数のカウント)
[16] pry(main)> 'sample'.size
=> 6
[17] pry(main)> 
to_iメソッド(StringクラスからIntegerクラスへの変換)
[19] pry(main)> '100'.class
=> String
[20] pry(main)> '100'.to_i
=> 100
[21] pry(main)> '100'.to_i.class
=> Integer
[22] pry(main)> 
to_fメソッド(StringクラスからFloatクラスへの変換)
[23] pry(main)> '10.5'.class
=> String
[24] pry(main)> '10.5'.to_f
=> 10.5
[25] pry(main)> '10.5'.to_f.class
=> Float
[26] pry(main)> 
文字の連結

「+」演算子を使った文字の連結

[27] pry(main)> '文字の' + '連結'
=> "文字の連結"
[28] pry(main)> 
文字列の末尾に文字列を追加
[27] pry(main)> '文字の' + '連結'
=> "文字の連結"
[28] pry(main)> 

変数を使っての連結も可能

[31] pry(main)> str = '文字の'
=> "文字の"
[32] pry(main)> str << '連結'
=> "文字の連結"
[33] pry(main)> str << 'です。'
=> "文字の連結です。"
[34] pry(main)> str
=> "文字の連結です。"
[35] pry(main)> 

変数を使った際の「+」と「<<」の動作の違いについて

[35] pry(main)> str + 'プラス'
=> "文字の連結です。プラス"
[36] pry(main)> str
=> "文字の連結です。"
[37] pry(main)> 

「+」での連結では変数「str」の中身に変更はありません。

「<<」を使った場合は下記の通り、変数「str」の中身が変更されています。

[37] pry(main)> str << '追加'
=> "文字の連結です。追加"
[38] pry(main)> str
=> "文字の連結です。追加"
[39] pry(main)> 

同じことを「+」でも行う場合は連結した結果を変数に格納する。

[39] pry(main)> str = str + 'プラス'
=> "文字の連結です。追加プラス"
[40] pry(main)> str
=> "文字の連結です。追加プラス"
[41] pry(main)> 

これをより簡単に書くと次のような書き方ができる。

[41] pry(main)> str += 'プラス'
=> "文字の連結です。追加プラスプラス"
[42] pry(main)> str
=> "文字の連結です。追加プラスプラス"
[43] pry(main)> 

これは「自己代入」と呼ばれるもので動作的にはstr = str + 'プラス'と同じですが、
シンプルに書くことが出来るのでこちらを推奨します。

同じ文字列を複数回表示する
[43] pry(main)> '文字' * 10
=> "文字文字文字文字文字文字文字文字文字文字"
[44] pry(main)> 

・文字列の中で式を展開する
※非常によく使用される!!

[45] pry(main)> two = '二'
=> "二"
[46] pry(main)> "1+1は#{two}"
=> "1+1は二"
[47] pry(main)> 

注意点として文字列の中で式を展開する場合はダブルクオートで括る必要があります。
シングルクオートだと式が展開されません。

[47] pry(main)> three = '三'
=> "三"
[48] pry(main)> '1+2は#{three}'
=> "1+2は\#{three}"
[49] pry(main)> 

ちょこっとメモ
#{}の中に直接式を書くことも出来る。

[49] pry(main)> "1+1は#{1+1}"
=> "1+1は2"
[50] pry(main)> 

以上Stringオブジェクトの覚書でした〜