2次元配列の初期化
###ダメな書き方
dp = Array.new(N+1, Array.new(M+1, 0))
dp[1][0]
を更新すると dp[0][0]
も更新されちゃうやつ(object_idが一緒)
###正しい書き方
dp = Array.new(N+1) {Array.new(M+1, 0)}
###参考
全角スペース
###まずみてください
if false
puts 'A'
else
puts 'C'
end
何も出力されません. エラーも出ません.
実は, elseの後に全角スペースが入ってます.
エラー出してくれ・・・
file_field_tagでファイル名しか送れない
ダメな書き方
<%= form_tag(controller: コントローラ名, action:"ほにゃ", multipart: true) do%>
<%= file_field_tag("file")%>
<%= submit_tag%>
<% end %>
.
.
.
p params[:file].class
.
.
.
これだとstring型だと言われ, 内容はfile名です.
URLをよく見ると, 最後に?multipart=trueみたいになってたので
あぁここの書き方がよくなさそうみたいな見当はつきました
ただしい書き方
<%= form_tag({controller: コントローラ名, action:"ほにゃ"}, multipart: true) do%>
<%= file_field_tag("file")%>
<%= submit_tag%>
<% end %>
結局どうしてだめだったのかあんまりわかってない
form_tag(リンク先 [オプション or HTML属性 or イベント属性]) do
end
らしいので, リンク先というのが一つのハッシュになってないといけないのかなぁ
って思ったけど
<%= form_tag(controller:hoge, action:fuga)%>
でも許されるんだよなぁ
ってきもちでわからない。
参考
配列の複製1
これは, 書く前にどうせそうだろうなぁ〜って思って調べたのでハマってはないけど。
ダメな書き方(=で代入)
A = [1,2,3]
B = A
B[0] = 0
p A
p B
p (A.object_id == B.object_id)
[0, 2, 3]
[0, 2, 3]
true
Aの中身も変わっちゃってます。
object_idも同じなので, そういうことです。
正しい書き方(clone, dup)
A = [1,2,3]
B = A.dup
B[0] = 0
p A
p B
p (A.object_id == B.object_id)
C = [1,2,3]
D = C.clone
D[0] = 0
p C
p D
p (C.object_id == D.object_id)
[1, 2, 3]
[0, 2, 3]
false
[1, 2, 3]
[0, 2, 3]
false
dup はオブジェクトの内容, taint 情報をコピーし、 clone はそれに加えて freeze, 特異メソッドなどの情報も含めた完全な複製を作成します。
###参考
配列複製2(浅いコピーと深いコピー)
上の続き。
###だめな書き方
A = [[1,1],[2,2],[3,3]]
B = A.dup
B[1] = [3,3] #これはいいけど
B[0][0] = 0 #これはだめ
p A
p B
p A.object_id == B.object_id
[[0, 1], [2, 2], [3, 3]]
[[0, 1], [3, 3], [3, 3]]
false
object_idは違うけど, 浅いコピーになってる。
clone や dup は浅い(shallow)コピーであることに注意してください。
###ただしい書き方
A = [[1,1],[2,2],[3,3]]
B = Marshal.load(Marshal.dump(A))
B[0][0] = 0
p A
p B
p A.object_id == B.object_id
[[1, 1], [2, 2], [3, 3]]
[[0, 1], [2, 2], [3, 3]]
false
###参考
#モデル名
###だめなこと
モデルの名前をrecordにする
railsで使ってるものと名前が被ってしまうらしくて, Record.newとかできなくなる.