超初心者がエンジニアになるまでの力戦奮闘の軌跡

プログラミングをメインで学んだことのアウトプットブログ

Railsガイドを読む #3 ~Active Record マイグレーション~

Railsガイド

railsguides.jp

上記のサイトはRailsのガイドが書かれているRailsを使う人間ならば必ず目を通すであろうガイド。 プログラミング初心者である自分はその中でRailsのことだけでなくIT用語でわからない用語が複数出てきたので、しっかりと理解して読み進めていきたいと思う。

なのでこの記事では実際にわからない用語や基礎的な内容で知っておきたいことを調べそれについてまとめていきたい。

わからない用語

スキーママイグレーションファイル

スキーマは空の状態から始まって、そこにマイグレーションファイルの変更を加えていくことでテーブル、カラムが追加や削除される。なのでマイグレーションファイルでスキーマのバージョンをどんどん更新していく感じ。

マイグレーションファイルでカラムを追加する

⋯Active Recordに用意されているジェネレータを使うことで自動的にタイムスタンプを生成することができる。さらに編集したいカラムやインデックスをコードに付随させることでそれらも自動的に生成 される。

例:part_numberカラムを追加し、インデックスも追加したい場合,rails g migration AddPartNumberToProducts part_number:string:indexとする。

書き方はAdd(削除する場合はRemove) + 追加するカラム名 + To(Removeの場合はFrom) + テーブル名。ちなみに追加するカラム名の部分はわかる言葉ならなんでもいい。複数のカラムを追加したい場合はDetailsなどにしたり。

class AddPartNumberToProducts < ActiveRecord::Migration[7.0]
  def change
    add_column :products, :part_number, :string
    add_index :products, :part_number
  end
end
テーブルを作成する

⋯基本的にジェネレータを使ってモデルを作成すると自動でテーブルも作成されるためあまりテーブルのみを新規で作成することはないような気がするが、やり方は覚えておく。

rails g migration CreateProducts name:stringとすることでProductsテーブルを作成しそこにnameカラムを追加する。

class CreateProducts < ActiveRecord::Migration[7.0]
  def change
    create_table :products do |t|
      t.string :name
      t.string :part_number

      t.timestamps
    end
  end
end
マイグレーションファイルで使えるメソッド

⋯これまでに説明してきたremove_columnadd_columnなどのメソッドの他にもカラムの情報を変更できるchange_columnメソッドや、not null制約を変更するchange_column_nullメソッド、デフォルト値を指定するchange_column_defaultメソッドがある。

change_column :products, :part_number, :text

# productsテーブルのpart_numberカラムの型をtextに変更
参照整合性の保証

validates :foreign_key, uniqueness: trueのようなバリデーション機能は、モデルでデータの整合性を強制している。dependentオプションなどだけでは参照整合性を維持できないためデータベースの外部キー契約機能などを用いて参照整合性を高められる。

executeメソッド

⋯Active Recordが提供するヘルパーの機能だけでは不十分な場合、executeメソッドで任意のSQLを実行できる。

changeメソッド

⋯テーブルやカラムに変更を加える場合に使われるメソッド。このメソッドを使うとマイグレーションを逆進させる(取消す)ことができる。

up/downメソッド

⋯changeメソッドの代わりに使え、upメソッドではスキーマに対する変換方法を記述し、downメソッドではupメソッドによって行われた変換をロールバックする方法を記述する。

revertメソッド

⋯revertメソッドを使うとActive Recordマイグレーションロールバック機能を利用できる。

マイグレーションの実行

rails db:migrateではまだ実行されていないchangeまたはupメソッドを実行する。またdb:schema:dumpコマンドも同時に呼び出されるため、スキーマファイル(db/schema.rb)を更新し、スキーマがデータベースの構造に一致するようにする。

マイグレーションファイルの指定をしたい場合はrails db:migrate VERSION=20080906120000のようにコマンドの後にVERSIONを追記することでそのファイルのみマイグレーションを実行する。

マイグレーションロールバック

⋯直前のマイグレーションを戻したい場合、rails db:rollbackロールバックできる。もしもマイグレーションを2つ以上ロールバックしたい場合は、rails db:rollback STEP=3とすることで最後に実行した3つのマイグレーションロールバックされる。

(rails db:migrate:redo STEP=3のようにredoコマンドでルールバックと再マイグレーションを一度に実行できるショトカコマンドもある)

データベースを設定する

rails db:setupコマンドは、「データベースの作成」「スキーマの読み込み」「seedデータを用いたデータベースの初期化」をまとめて実行する。

データベースをリセットする

rails db:reset```コマンドは、データベースをdropしてsetupを実行する。

環境を指定してマイグレーションを実行する

⋯デフォルトではrails db:migrationはdevelopment環境で実行される。これを他の環境で実行する場合は、コマンドをrails db:migrate RAILS_ENV=testとするとtest環境でマイグレーションを実行することとなる。

マイグレーション実行結果の出力を変更する

⋯あまり使うイメージができないが、マイグレーション実行時、結果としてデフォルトでは実行内容とそれぞれの所要時間が出力されるが、これをsayメソッドなどを使うと指定したメッセージを出力したり、所要時間を設定したりできる。

マイグレーションの変更

⋯ミスなどでマイグレーションを編集したくなった場合、ロールバックしてマイグレーションを修正すればいいがあまりこのやり方は良くない。開発環境のみでのマイグレーションならいいが、これがproduction環境なら大変だし、開発環境でも共同作業なら他の人の誤解やエラーを招くことになりかねない。そのためマイグレーションファイルを編集する場合、既存のファイルを修正するのではなく、新たに修正用のマイグレーションファイルを用意してマイグレーションを更新する方が良い。

Railsガイドを読む #2 ~Active Recordの基礎~

Railsガイド

railsguides.jp

上記のサイトはRailsのガイドが書かれているRailsを使う人間ならば必ず目を通すであろうガイド。 プログラミング初心者である自分はその中でRailsのことだけでなくIT用語でわからない用語が複数出てきたので、しっかりと理解して読み進めていきたいと思う。

なのでこの記事では実際にわからない用語や基礎的な内容で知っておきたいことを調べそれについてまとめていきたい。

わからない用語

ORM(オブジェクト/リレーショナルマッピング)

⋯オブジェクトとRDMとのマッピングを行う=>SQLを直接書かずにオブジェクトのメソッドで簡単にDB操作を可能にするもの。RailsではActive RecordがこのORMシステムの「Active Recordパターン」を実装したもの。

モデルの命名ルール

⋯モデルのクラス名は大文字で単数形(例:Book)。テーブル名は複数形になる(books)。モデルのクラス名を2語以上にする場合はキャメルケースを使用する(例:BookClub)。テーブル名はスネークケースとなる(例:book_clubs)。

スキーマ命名ルール

⋯データベースのテーブルで使うカラム名についても利用目的に応じたルールがある。外部キーの場合は「テーブル名の単数形_id」(例:item_id)とする。主キーの場合はidというカラムが使われる。

newメソッドとcreateメソッドの違い

⋯どちらも新しいオブジェクトが返されるが、createメソッドを実行すると新しいオブジェクトが返され、さらにデータベースに保存される=>new+save

*createやnewでブロックを渡すとそのブロックで初期化された新しいオブジェクトがyieldされる 例:

user = User.new do |u|
  u.name = "David"
end

同じ要領でupdateメソッドもsaveメソッドを使う必要のないメソッド。

# userにnameが"David"のユーザーを代入し、"Dave"にupdate
user = User.find_by(name: 'David')
user.name = 'Dave'
user.save

↓

# updateメソッドでsaveメソッドを使わずにupdate
user = User.find_by(name: 'David')
user.update(name: 'Dave')
複数のレコードを一度に更新する

⋯update_allというクラスメソッドによって複数のレコードを一気に更新できる

複数レコードを削除する

⋯条件を指定して複数削除する場合はdestroy_byを使用し、全ユーザーを削除する場合はdestroy_allを使用する。

破壊的メソッドを使う場合

update!save!など破壊的メソッドを使用すると失敗した場合にfalseではなく例外を発生させる。

Railsガイドのわからない用語など #1 ~Railsをはじめよう~

Railsガイド

railsguides.jp

上記のサイトはRailsのガイドが書かれているRailsを使う人間ならば必ず目を通すであろうガイド。 プログラミング初心者である自分はその中でRailsのことだけでなくIT用語でわからない用語が複数出てきたので、しっかりと理解して読み進めていきたいと思う。

なのでこの記事では実際にわからない用語や基礎的な内容で知っておきたいことを調べそれについてまとめていきたい。

わからない用語

スクリプト

⋯プログラムの種類の一つで、人間が読み書きしやすいプログラミング言語で書かれたプログラム(ソースコード)を即座に実行できるようなもの。Railsではジェネレータというものがこのスクリプトのことでこれが多数付属されているためモデル作成などの特定のタスクを行う際に必要なもの(ファイルなど)を自動で生成してくれる。

スキーマ

⋯データベースにおけるスキーマとは「データベースの設計図」のようなもの。OSに置き換えるとディレクトリに相当するのがスキーマで、ファイルに相当するのがテーブルとなる。データベースの構造のようなもの。MySQLでは複数のデータベースを持つことができ、この1つ1つのデータベースをスキーマと定義している。

スモークテスト

⋯開発途上のソフトウェアをテスト(試験)する手法の一つで、開発・修正したソフトウェアを実行可能な状態に組み立て、起動するかどうかや基本的な機能が動作するかなどをざっと確認すること。Railsでははじめlocalhost:3000に接続してRailsの起動ページが表示されるかどうかがスモークテストとなる。

publicメソッド

⋯コントローラはRubyのクラスで、そのクラスのpublicメソッドがアクション。このpublicメソッドは制限が全くないメソッドを指す。

rootルーティングの書き方

root "articles#indexでトップページ(開発の際はhttp://localhost:3000)を開くと自動でindexに割り当てられる

オートロード

Railsではアプリケーションのクラスやモジュールはどこでも利用できるのでrequireを書く必要がない。この機能をオートロードという。

requireを書く必要があるのは、

①lib/ディレクトリの下にあるファイルを読み込むとき

②Gemfileでrequire: falseが指定されているgem依存を読み込むときの2つ。

モデル名

⋯常に単数形で表記する。理由はインスタンス化されたモデルは1件のデータレコードを表すから。この規約を覚えるために、モデルのコンストラクタを呼び出す時にArticle.new()と単数形で書くということを思い出す。

マイグレーション

⋯データベースを操作する機能。マイグレーションファイルのcreate_tableメソッドはarticlesテーブルの構成方法を指定する。create_tableメソッドはデフォルトでidカラムを主キーとして追加する。

create_tableのブロックの末尾業はt.timestampsmwソッドを呼び出す。これでcreated_atupdated_atという2つのカラムを追加している。

ActiveRecord::Relationオブジェクト

⋯allメソッドなどで返すオブジェクトで一種の強力な配列と考える。

ERB(Embedded Ruby)

⋯ドキュメントに埋め込まれたRubyコードを評価するテンプレートシステムのこと。<%= %>などのERBタグを使用。

パラメータ

⋯ルーティングでget "/articles/:id", to: "articles#show":idの部分のことをルーティングパラメータと呼ぶ。これはリクエストのパス(URL)に含まれる特定の値をキャプチャして、その値をparamsというハッシュに保存する。このparamsはコントローラのアクションでもアクセスできる。例えばhttp://localhost:3000/articles/1というリクエストを扱う場合、1がキャプチャされ、showアクションでparams[:id]と書くと1にアクセスできる。

リソースフルルーティング

Railsはresourcesというルーティングメソッドを提供し、リソースの集まり(コレクション)を対応づけるのによく使われるルーティングをすべて対応づけてくれる。

resourcesメソッドではurlで終わるURLヘルパーメソッドと、pathで終わるパスヘルパーメソッドも自動的に設定する。このパスヘルパーを使うことで、コードが特定のルーティング設定依存することを避けられる。たとえば記事1件渡されると、article_pathヘルパーは"/articles/#{article.id}"を返す。

link_toヘルパーを用いる際も、第一引数はリンクテキスト、第二引数はリンク先を記述するが、第二引数にモデルオブジェクト(article)を渡すと、link_toが適切なヘルパーを呼び出してオブジェクトをパスに変換(article_path)する。

redirect_toとrender

⋯redirect_toの場合はブラウザで新しいリクエストを発生させる。なのでデータベースの変更を終えたあとに使うべきで、もしも変更される前に呼び出すとユーザーがブラウザをリロードしたときに同じリクエストが再送信され、変更が重複してしまう。renderは指定のビューを現在のリクエストとしてレンダリングする。

なのでrenderは表示させるviewファイルを指定、redirect_toはURL(HTTPリクエスト)を指定。

フォームビルダー

Railsの機能で、最小限のコードを書くだけで設定が全て出来上がったフォームを表示でき、かつRailsの規約に沿うことができる。

<h1>New Article</h1>

<%= form_with model: @article do |form| %>
  <div>
    <%= form.label :title %><br>
    <%= form.text_field :title %>
  </div>

  <div>
    <%= form.label :body %><br>
    <%= form.text_area :body %>
  </div>

  <div>
    <%= form.submit %>
  </div>
<% end %>

上記のコードでは、まずform_withというヘルパーメソッドがフォームビルダー(form)をインスタンス化する。そしてform_withのブロック内でフォームビルダーのlabeltext_fieldといったメソッド呼び出すと適切なフォーム要素が出力される。

ストロングパラメータ

⋯フォームから送信されたデータはparamsハッシュに保存され、createアクションなどでparams[:article][:title]などで用いると記事のタイトルにアクセスできる。この値を個別にArticle.newに渡すこともできるがそれだと面倒なのと毎回フィルタをかけなければセキュリティ的に第三者が悪意を持ったデータに書き換え上書きすることができてしまうため、Railsではあらかじめフィルタがかかっていないデータの受け渡しをArticle.newなどにするとForbiddenAttributesErrorと警告が出るようになっている。

そのためストロングパラメータという機能でparamsをフィルタする。

バリデーション

⋯無効なユーザー入力を適切に処理するための機能。バリデーションとはモデルオブジェクトを保存する前に自動的にチェックするルールのこと。そのチェックに失敗した場合は保存を中止し、モデルオブジェクトのerror属性に適切なエラーメッセージが追加される。

モデル側でバリデーションを設定した上で

    <% @article.errors.full_messages_for(:title).each do |message| %>
      <div><%= message %></div>
    <% end %>

のような形でviewに記述することで、full_messages_forメソッドが指定の属性に対応するわかりやすいエラーメッセージを含む配列を1つ返す。その属性でエラーが発生していない場合は配列は空となる。

パーシャル内でインスタンス変数に依存しない

⋯パーシャルファイルは共有ビューのことでそのファイルのコードがいろいろな場面で共有されるので、パーシャル内には特定のインスタンス変数を使わない方がよい。つまりコントローラのアクションで定義されているインスタンス変数を使うと他のアクションで共有する際に不具合が生じる可能性があるため。なのでローカル変数を設定し、インスタンス変数はそのパーシャルを呼び出す際に設定しておく。

<%= render "form", article: @article %>

# 呼び出された_formパーシャル内では@articleをarticleとして扱うという設定
Turboにフックしてdataオプションを使う

Railsバージョン7.0からはデフォルトでTurboというものが含まれているため、destroyアクションで記事を削除する際にはこれを使い、data-turbo-methoddata-turbo-confirmを設定する。

data: {
                    turbo_method: :delete,
                    turbo_confirm: "Are you sure?"
                  }

今回ははこうすることで、turbo_method: :deleteでGETリクエストではなくDELETEリクエストを送信し、turbo_confirm: "Are you sure?"でリンクをクリックすた時に指定した文字列がダイアログに表示されるようになる。

:references

⋯モデルを作成する時に:referencesというキーワードを設定することでモデル名の後ろに_idを追加した名前を持つ新しいカラムをデータベーステーブルに作成する。

モデル同士の関連付け

⋯Active Recordの関連付け機能により簡単に関連付けを宣言できる。

例:記事とコメントという2つのモデルの場合、①1件のコメントは1件の記事に属する。②1件の記事はコメントを複数持てる。

# Commentモデル
class Comment < ApplicationRecord
  belongs_to :article
end

# Articleモデル
class Article < ApplicationRecord
  has_many :comments

  validates :title, presence: true
  validates :body, presence: true, length: { minimum: 10 }
end

上記の宣言によってさまざまな動作が自動化される。たとえば、@articleというインスタンス変数に記事が1件含まれていれば、@article.commentsと書くだけでその記事に関連づけられているコメントを全て取得できる。

concern

Railsの「concern(関心事)」とは、大規模なコントローラやモデルの理解や管理を楽にする手法のこと。複数のモデルやコントローラが同じconcernを共有していれば、それを再利用できるというメリットがある。concernはRubyのモジュールで実装され、モデルやコントローラが担当する機能のうち、明確に定義された部分を表すメソッドをそのモジュールに含める。

実際にrails newでアプリを作成するとapp/内にconcrnsフォルダが作成される。

app/controllers/concerns
app/models/concerns
validationオプションの「inclusionヘルパー」の使い方

⋯concernを扱うに伴い、モデルのvalidationでinclusionというものを使うことになった。これはvalidatesするカラムに入る値を制限するもの。

例:statusカラムにpublic,private,archivedの3つのステータスを設定する場合。

VALID_STATUSES = ['public', 'private', 'archived']

  validates :status, inclusion: { in: VALID_STATUSES }

inclusionヘルパーはinオプションで設定する。

concernのファイルにロジックを移す

⋯例えば記事とコメントのモデルにstatusをarchivedにするようなarchived?メソッドを作るとした時に、ArticleモデルとCommentモデルにそれぞれメソッドを定義すると今後他の機能をつける際にそのモデルにもarchived?メソッドを作らなくてはならなくなる。なのでconcernを利用し、app/models/concernsにvisible.rbという新しいファイルを作りそこに共有するメソッドを定義しておくようにする。

module Visible
  def archived?
    status == 'archived'
  end
end

また、先ほど調べたvalidationのinclusionヘルパーの部分(ステータスを制限する部分)も同じロジックなのでまとめたいが、このようなバリデーションメソッドはクラスレベルで呼び出されるため、より複雑になる。

バリデーションメソッドをconcernでまとめる

⋯バリデーションメソッドの場合はAPIドキュメントのActiveSupport::Concernというものを使用するためにまずextend ActiveSupport::Concernを記述する。

そしてバリデーション部分をincludedで囲む。

module Visible
  extend ActiveSupport::Concern

  VALID_STATUSES = ['public', 'private', 'archived']

  included do
    validates :status, inclusion: { in: VALID_STATUSES }
  end

  def archived?
    status == 'archived'
  end
end

上記のような形にまとめられ、これをモデルでinclude Visibleに修正する。

関連付けの削除

⋯記事を削除するとその記事に関連付けされているコメントも削除したい。そんな時には記事のモデルにdependentオプションを付けることで実現できる。

has_many :comments, dependent: :destroy
BASIC認証

⋯記事の編集やコメントの削除などを認証した人物のみができるようにするためにRailsではHTTP認証システムが用意されている。

# indexアクションとshowアクションは自由にアクセス、それ以外は認証を要求する

class ArticlesController < ApplicationController

  http_basic_authenticate_with name: "dhh", password: "secret", except: [:index, :show]

  def index
    @articles = Article.all
  end

上記を設定すると実際に記事を新規作成する場合などにuser nameとpasswordで認証する必要がある。他にもRailsではDeviseなどのgemで認証システムが作れる。

学んだこと ~8/28~

Ruby(Rails)

・ルーティング⋯リクエストを解析してどのように処理をすればいいのかを決めるプログラム。

ブラウザからやってくるリクエストはURLとHTTPメソッドと呼ばれる2つの値のペアで構成される

GETリクエスト⋯アドレスバーにURLを入力した時や、クリックでURLに飛ぶ場合に使うリクエス

POSTリクエスト⋯会員登録やブログの投稿などに使うリクエス

イメージではサイトの表示をするのがGETリクエスで、データの送信がPOSTリクエス

・ルーティングの書き方⋯HTTPメソッド URLパターン(URL末尾), to: "コントローラ名#メソッド名"となる

例)

get "/books", to: "books#index" 
# これで「~/books」というURLとGETというHTTPメソッドがペアでリクエストされたら、booksコントローラのindexアクションを実行するという意味になる。

・テンプレートエンジン⋯RubyのコードをHTMLファイルの中で実行する仕組み。Railsではerbを使う。

学んだこと 〜2022/8/27〜

今日学んだ知識

Ruby(Rails)

1.DBMS(データベースマネジメントシステム)とは?

データベースはただの場所であり、そのデータベースにデータを登録したり取得したりするソフトウェアのこと。

無料で使えるものにMySQLPostgreSQLSQLiteなどがある。

しかし、実際にRailsで開発する際にデータベースへの登録などはSQLを使ってこなかった。これはRailsActiveRecordというライブラリを経由することでSQLを触ることなくでデータを操作できるから。

つまりActiveRecordではRubyのコードをSQLに変換するという操作を行なってくれる。

# RubyでBookクラスのデータを全て取得するコードを
Book.all

↓ ActiveRecordで

# SQLでBookクラスのデータを全て取得するコードに変換される
select * from books;

モデルを作成するとclass Book < ApplicationRecordとなっており、作成したモデルはActiveRecordをベースにしているApplicationRecordを継承しているため、、モデル作成と同時にActiveRecordの機能が備わっている。

さらにActiveRecordにはデータベースから取得したデータ(レコード)をモデルのインスタンスへ変換するという機能がある。

例:

id = 1

book = Book.find(id)

# ActiveRecordのfindメソッドでid=1のデータを取得し、bookに代入することでBookモデルのインスタンスになる。
2.Bookモデルはrails g model Bookで作成したが、これに対応するBookテーブルはどうやって作成されるのか?

まずデータベースのテーブル自体を操作するのはRailsマイグレーションという機能。マイグレーションでは「マイグレーションファイルの作成」「マイグレーションファイルの実行」という2段階を行う。

rails g modelというコマンドでモデルと一緒にマイグレーションファイルも作成される。=>マイグレーションファイルの作成

rails db:migrateというコマンドでマイグレーションファイルを実行し、そのファイルを元にテーブルが作成される。=>マイグレーションファイルの実行

マイグレーションファイルは実行したら、そのあとは編集しない!開発途中でテーブルに変更を加える場合はrails g migration addなどで新たにマイグレーションファイルだけを作成し、rails db:migrateで実行する。

つまりイメージでは新しいマイグレーションファイルで前のマイグレーションファイルを上書きしてしまうみたいな感じかな?

Ruby技術者認定試験 Silver試験の模擬問題集を解いてみた #3

概要

前回の続きとなります。今回はQ15〜Q20までで調べたものをまとめていきます。

前回の記事はこちら

利用サイト

https://gist.github.com/sean2121/945035ef2341f0c39bf40762cd8531e0

実践

問題15

  • ioクラス⋯プログラムの外部とデータのやりとりをするための機能として入力(Input)と出力(Output)を提供するクラス

Ruby IOクラスについて学ぶ - Qiita

この問題はioクラスのメソッドの使い分けができているかを確認する問題となります。

  • readlineメソッド⋯一行読み込んで、読み込みに成功した時にはその文字列を返します。

  • rewindメソッド⋯ファイルポインタ(ioオブジェクトが指すファイルの位置)を先頭に移動。行番号を0にします。

  • seek(offset,whence)メソッド⋯ファイルポインタをwhenceからoffsetのバイト分移動し、移動で来たら0を返します。

問題18

この問題は正規表現についての問題です。

正規表現に関しては下記のサイトが詳しく書かれているのでそちらを参考にしていただければこの問題も解けると思います。

Ruby 正規表現の使い方 - Qiita

/^[hc].*o$/i

まず、^[hc]で先頭がhかcから始める文字列をマッチします。

次に.では改行以外の任意の文字列をあらわし、o$で文字列の末尾がoで終わるものをマッチします。

これらのことから選択肢の中で、「hかcから始まりoで終わる文字列」を選択すればOKです。

問題19

定義されている定数に値を新しく代入した際にどうなるかの問題です。

個人開発しかしたことがないため定数を使う機会がなく、調べたことがありませんでした。下記のサイトがわかりやすく説明されています。

【Ruby】 定数について学んでみよう。変数との違いは? | Pikawaka

Rubyの場合、定数に再代入するとwarningが発生しますが再代入可能、つまり値は書き変わってしまいます。

問題20

File#joinはFile::SEPARATOR(/)を第一引数の末尾や第二引数の先頭の/を削除してから、間に入れて連結をします。

irb(main):028:0> File.join("a","v")
=> "a/v"
irb(main):029:0> File.join("a","/v")
=> "a/v"
irb(main):030:0> File.join("a","/v","c")
=> "a/v/c"

まとめ

今回は15~20問までやりました。

あまり使用したことがない知識が多かったですが、しっかりと理解していきたいです。

Ruby技術者認定試験 Silver試験の模擬問題集を解いてみた #2

概要

前回の続きとなります。今回はQ6〜Q14までで調べたものをまとめていきます。

前回の記事はこちら

利用サイト

https://gist.github.com/sean2121/945035ef2341f0c39bf40762cd8531e0

実践

問題8

この問題は配列に対するメソッドの使い方を理解できているかの問題となります。

  • compactメソッド⋯自身から nil を取り除いた配列を生成して返します

例:

[1,nil,nil,2].compact
=> [1, 2]
  • flattenメソッド⋯多次元配列を一次元配列にして返します

例:

[1,2,3,[1,2,3],4,5].flatten
=> [1, 2, 3, 1, 2, 3, 4, 5]
  • joinメソッド⋯配列内の中を連結して文字列として返します

例:

[1,2,3].join
=> "123"
# String

この問題ではブロックが後ろにあるので、繰り返し処理を行うEnumerableモジュールのメソッドを選べるかどうかでした。

問題9

この問題はdeleteメソッドについて理解できているかどうかの問題です。

  • deleteメソッド⋯メソッドのレシーバーとなったオブジェクトから文字列を取り除いた文字列を返すします

例:

"a b c d e".delete("ae")
=> " b c d "

問題10

まずヒアドキュメントというのが聞いたことすらありませんでした。ヒアドキュメントとは複数の文字列を埋め込む書き方のようです。

下記のサイトがわかりやすく書かれていたのでおすすめです。

Rubyのヒアドキュメントの書き方いろいろ - Hack Your Design!

終わりのE0Fをインデントする場合は最初のEOF-EOFという形にしなければならないということを知っているかの問題でした。

問題11

  • clearメソッド⋯空の配列、ハッシュを返します

この問題では、配列とハッシュで同じ動きをするメソッドを知っているかどうかの問題となります。clearメソッド以外にも中身を置き換えるreplaceメソッドなども配列とハッシュで同じ動きをします。

問題13

  • chompメソッド⋯文字列の末尾にある改行(\r、\r\n、\n)を削除した文字列を返します。

*末尾以外の改行は削除しません。

ちなみに\r、\r\n、\nの違いはOSによって使いわけるらしいです。

テキストファイル - 改行の、\nと\r\nの違いは何ですか? - スタック・オーバーフロー

問題14

  • chopメソッド⋯文字列の末尾の文字を削除し文字列を返します。ただし、末尾に改行が入っていた場合は改行を削除して文字列を返します。

問題13のchompメソッドとの違いは、chopメソッドは末尾が改行でなくても1文字削除して返すことです。

まとめ

今回は6~14問までやりました。

基礎的な問題が多いのでこの辺りの問題はRubyを使う者としてスラスラと答えられるようにします。