しかしその理屈だと

str || (str = '文字列')

では NameError は出るはずがないことにならないか?

str = '文字列'

が宣言として扱われて str はとりあえず nil になるんだろ?