はじめに
プログラマー初学の人へ61の質問を見ました。
そもそも全くわからないものもたくさんあったのですが、わかると思っていたことも言葉で説明はできないなと感じました。なので、この機会に調べてまとめることにします。
前半の19番目まで説明ができれば初学のスキルとしては十分だと思う。
とのことです。
ちなみに盛大に未完成です。
言語
- Ruby
- たまにJavaScript
答えてみる
1. 変数と定数の違いは何ですか?
変数
再代入が可能。
Rubyでは小文字で定義する。foo = 'foo'
JSではlet
で定義する。let bar = 'bar'
定数
再代入しない。再代入した場合、Rubyでは警告が出る(再代入自体は可能)。JSではエラーが出る(再代入不可能)。
Rubyでは大文字から始まるものを定数と認識する。実際使っているのを見る限りは全て大文字にしている。FOO = 'foo'
JSではconst
で定義する。const bar = 'bar'
2. 変数と定数はどのように使い分けますか?
Rubyでは基本的に変数を使う。
VERSION
としてモジュール内で定義したりするときに定数を使う(らしい。まだ実際に使ったことがない)。また、Rubyには組み込み定数(例:ENV
)もある。
JSでは基本的に定数を使う。
配列の中身が変わるのは定数でも問題ない。
let
が出たら「お、再代入するものなんだな」という心構えをする。
3. コメントの書き方はわかりますか?
|
|
|
|
|
|
|
|
4. 四則演算はどのように行いますか?
1 + 1 # => 2 加算
2 - 1 # => 2 減算
2 * 3 # => 6 乗算
2 ** 4 # => 16 累乗
6 / 2 # => 3 除算
10 / 3 # => 3 余りは切り捨て
10 % 3 # => 1 余り
小数点で表したい場合は、どちらかの数字にto_f
を付ける。
10 / 3.to_f
=> 3.3333333333333335
10.to_f / 3
=> 3.3333333333333335
5. WIP 演算子、論理式、比較子って何ですか?
演算子
代数演算子:
Ruby 入門 - 演算子
論理式
比較子
演算子 | 記述例 | 意味 |
---|---|---|
== | a == b | b が a に等しい |
!= | a != b | b が a に等しくない |
> | a > b | b より a が大きい |
>= | a >= b | b より a が大きいか等しい |
< | a < b | b より a が小さい |
<= | a <= b | b より a が小さいか等しい |
引用:関係演算子
==
と===
Rubyで使われる記号の意味
演算子 | 記述例 | 意味 | 別の演算子 |
---|---|---|---|
&& | a && b | a と b が共に真の場合に真 | and |
|| | a || b | a か b の少なくとも 1 つが真の場合に真 | or |
! | !a | a が真の時に偽、偽の時に真 | not |
引用:論理演算子
&&
||
はand
or
より意味が重い。
6. 三項演算子って何ですか?
こういう書き方のこと。if return
の文を一行でスッキリ書ける。
条件式 ? trueのときの返り値 : falseのときの返り値
|
|
7. Integer型とFloat(Double)型の違いは何ですか?
Ingeger型
整数。誤差はない。
Float型
浮動小数点数。
誤差があり得る小数のことだが、ざっくり小数という認識でいい気がする。誤差があるのは仕方ない、らしい。
|
|
参考:浮動小数点って何?
8. 分岐処理の構文を教えてください。
if文
if n == 2
puts 'その数は2です'
elsif n.even?
puts 'その数は偶数です'
else
puts 'その数は奇数です'
end
case文
|
|
case文での比較は==
ではなく===
による。
9. ループ構文を教えてください。
for文
|
|
while文
|
|
Rubyに関して
Rubyの場合は以下のような記述が可能ですが、以下の書式は厳密には基本構文ではありません。
以下のプログラムは関数ブロックを利用したループ処理になります。
Rubyを学習している方は以下の書式と上記の回答の違いについても教えてください。
|
|
この辺りはよく知らずに使っていました。
例えば、メソッド#times
は配列の中身をそれぞれ取り出して処理をしている。
メソッドによるというのが大きな違い。
Array(1..3).each do |n|
puts "#{n}回目の処理です。"
end
n = 0
loop do
break if n >= 3
puts "n = #{n}"
n += 1
end
ちなみに、それぞれの処理速度は以下の通り。
速度は多少変動はあるものの、順位は変わらず。
user system total real
for 1000000
0.066308 0.005508 0.071816 ( 0.075733)
each 1000000
0.076021 0.007584 0.083605 ( 0.090589)
times 1000000
0.070877 0.007122 0.077999 ( 0.092721)
while 1000000
0.038416 0.004368 0.042784 ( 0.045299)
loop 1000000
0.087187 0.008145 0.095332 ( 0.101498)
code : while = 0.05[sec]
code : for = 0.08[sec]
code : each = 0.09[sec]
code : times = 0.09[sec]
code : loop = 0.10[sec]
コードはこちらのものを使用:Ruby..rb のループ(loop, each, while, for)の速度のベンチマーク
10. 配列の構文を教えてください。
Arrayクラスと配列がある言語の場合はこの違いも教えてください。
|
|
何でも入れられる。
array = []
array = Array.new
11. ハッシュ(辞書)の構文を教えてください。
|
|
taro = { '名前' => '太郎', '年齢' => 10 }
taro['名前'] => "太郎"
hanako = { name: '花子', age: 13 }
hanako[:age] => 13
ハッシュは日本語でもいいが、英語にしたほうが無難。
12. 関数(メソッド)の構文を教えてください。
|
|
const name = function (arg) {
// 処理
};
name(arg);
Rubyは引数がない場合は()
を省略できるが、JSは()
省略不可。
13. 関数(メソッド)を使用する利点を教えてください。
- 処理ごとに細分化できる
- 使い回しができる
そのままメイン処理に記述するのと関数化するのでは何が違うのでしょうか?
また、一箇所でしか呼び出されない関数を定義する必要はありますか?
ある場合はなぜですか?
保守性……テストをしやすいようにするため、かなあ。
14. 標準出力の方法を教えてください。
|
|
console.log("Hello world!");
15. 文字列の連結、検索方法を教えてください。
|
|
<<
を使うこともできるのか。これは初知り。
|
|
16. クラスの構文を教えてください。
|
|
17. インスタンス変数とは何ですか?
@hoge
範囲が広い。グローバル。
普通の変数は定義したスコープの外からは取得できない。
18. WIP クラス変数とインスタンス変数の違いは何ですか?
メモリ空間の使い方に関しても説明できる回答できると良いです。
19. WIP スタティック領域とは何ですか?
クラス変数について理解があれば大した質問ではありません。
クラス変数もしくはスタティック領域のどちかしか回答できない人は知識が不十分です。勉強しましょう!
20. クラスの継承構文を教えてください。
|
|
21. WIP 型キャストはできますか?
クラスのキャストができる条件なども教えてください。
あと、どういう時に使いますか?
22. 型チェックの構文を教えてください。
|
|
23. 関数(メソッド)の初期値って設定できますか?
|
|
24. インターフェース(objective-cやswiftではプロトコル)とは何ですか?
25. インターフェース(objective-cやswiftではプロトコル)はどのような局面で使用しますか?
26. クラスの継承をするメリットは何ですか?
継承、ポリモルィズムは併用して使われることが多いです。
27. 自分自身のクラスを示すキーワードは何ですか?
this? self?
super は何を指してます?
28. ポリモルフィズムとは何ですか?
オブエジェクト指向の三大要素の一つです。
継承と一緒に抑えておくと良いでしょう。
29. ダックタイピングとポリモルフィズムの違いを教えてください。
Ruby を行っているとインターフェースの出番がない代わりにダックタイピングが発生します。
Java ではダックタイピングはできませんが言葉は知っておくと良いでしょう。
30. カプセル化のメリットは何ですか?
スクリプト言語ではあまり恩恵を感じないカプセル化ですが、、、抑えておきましょう。
31. アクセス演算子って何ですか?
カプセル化が分からないとこれもわからない。
32. タプルとはなんですか?
Java や.NET の場合はタプルは構文でサポートされてませんが、擬似的には行えますので知らない場合は調べておいてください。
33. クラスを使うメリットは何ですか?
これは手続き型言語とオブジェクト指向型言語の違いを把握しているかどうかの質問になります。
34. 例外処理はどうやって書きますか?
|
|
Exception
はrescueするなという教えがある。特に引数を指定しなければStandardError
になる。
35. バージョン管理システム(SCM)とは何ですか?
- ファイルA
- ファイルA 5/4 時点
- ファイルA 〇〇が編集中
- ファイルA 最新版
- ファイルA 最新版(1)
- ファイルA これが最新!
ってならないようにするためのもの。
更新日時と編集者、ファイルの差分などをまとめて管理してくれる。
36. バージョン管理システム(SCM)は何を使ってますか?
Git以外使ったことがない。
プル/プッシュ/フェッチ/クローンなどのコマンドの使い方を教えてください。
git pull
リモートhoge
ブランチの状態をローカルのhoge
ブランチに反映する。git pull origin develop
みたいな使い方。
git fetch
とgit merge
の合わせ技。
git push
ローカルブランチhoge
の変更をリモートブランチhoge
に反映させる。
git fetch
リモートhoge
ブランチの状態をローカルのorigin/hoge
ブランチに反映する(場合によってはoriginじゃないけど)。
git clone
リモートのデータをリポジトリごとローカルに丸ごと持ってくる。
37. スクリプト言語とコンパイル言語の違いは何ですか?
あと、メリット・デメリットも!
38. データベースって何ですか?
もはやどのシステムを使っても切っても切れない関係。
最近は NoSQL 系も切れない関係になりつつある。
39. トランザクション管理って何ですか?
アトミック性とかの把握は重要です。
40. スレッドって何ですか?
スレッド発行は Java で作るとコード量が少し多くて面倒臭い。
41. プリミティブ型とオブジェクト型って何ですか?
メモリまで考えて回答お願いします!
42. 無名関数/匿名関数って何ですか?
Java では、、、いやAndroid Java
では多用する。
43. メタプログラミングって何ですか?
概念だけは知ってたほうがいい言葉。
以下はとりあえず答えられそうにないので隠す。
おわりに
「聞いたことはあるけど説明できない」というものはまだまだあるので、随時書いていきたい。