Короткий рассказ:
«Почему defined?(59[0][:whatever])
оценивается как истина?»
Длинная история:
В последнее время я столкнулся с каким-то странным поведением, которое сбило меня с толку.
Я разрабатывал метод, который выполнял некоторую промывку данных:
#Me washing input data:
def foo(data)
unless data && defined?(data[0]) && defined?(data[0][:some_param])
method2(data[0][:some_param])
else
freak_out()
end
end
Обычно я пишу тесты, в которых выбрасываю всевозможные ненужные данные, чтобы убедиться, что ничего странного не происходит:
describe "nice description" do
it "does not call method2 on junk data" do
expect(some_subject).to_not receive(:method2)
random_junk_data_array.each do |junk|
some_subject.foo(junk)
end
end
end
Ну, method2
звали сюда. Это произошло, когда junk
был фикснумом.
Я использую ruby 2.1.0
, и я вижу, что Fixnum
имеет метод #[]
, который извлекает бит в этой позиции, хорошо.
Но почему fixnum[0][:some_param]
считается defined
?