なぜか必要のないendを要求される
質問に至った背景
Rubyで入力された数の範囲の素数をもれなく求める関数を書いているのですが,なぜか不要なend
キーワードを求められます.このend
がどこの区切りかわからなかったので質問させていただきました.なお私個人としてはirb(下記ログ参照)でいう33行目のend
はコード中のendを要求する命令はすべてendで閉じられているため不要
だと考えています.
問題のコード
このコードは入力された数の範囲の素数をエラトステネスのふるい
ではじき出す関数のみを定義してます.
#!/usr/bin/env ruby
def sieve(num);
n = num;
array_seed = [];
while n > 1 do
array_seed << n;
n -= 1;
end
array_seed.reverse!;
primes = [];
while true do
array_seed_tmp = array_seed.shift;
primes << array_seed;
break if !array_seed_tmp
trashnum = [];
array_seed.each do |x|
trashnum << x; if x % array_seed_tmp == 0
end
primes -= trashnum
end
array_string = primes.to_s;
array_string.each do |y|
print("#{y}\s");
end
end
end
これの場合irb
のチェックが通ります.
psieve.rb(main):001:0> #!/usr/bin/env ruby
=> nil
psieve.rb(main):002:0>
psieve.rb(main):003:0> def sieve(num);
psieve.rb(main):004:1>
psieve.rb(main):005:1> n = num;
psieve.rb(main):006:1> array_seed = [];
psieve.rb(main):007:1>
psieve.rb(main):008:1> while n > 1 do
psieve.rb(main):009:2* array_seed << n;
psieve.rb(main):010:2> n -= 1;
psieve.rb(main):011:2> end
psieve.rb(main):012:1>
psieve.rb(main):013:1> array_seed.reverse!;
psieve.rb(main):014:1> primes = [];
psieve.rb(main):015:1>
psieve.rb(main):016:1> while true do
psieve.rb(main):017:2* array_seed_tmp = array_seed.shift;
psieve.rb(main):018:2> primes << array_seed;
psieve.rb(main):019:2>
psieve.rb(main):020:2> break if !array_seed_tmp
psieve.rb(main):021:2>
psieve.rb(main):022:2> trashnum = [];
psieve.rb(main):023:2>
psieve.rb(main):024:2> array_seed.each do |x|
psieve.rb(main):025:3* trashnum << x; if x % array_seed_tmp == 0
psieve.rb(main):026:4> end
psieve.rb(main):027:3> primes -= trashnum
psieve.rb(main):028:3> end
psieve.rb(main):029:2> array_string = primes.to_s;
psieve.rb(main):030:2> array_string.each do |y|
psieve.rb(main):031:3* print("#{y}\s");
psieve.rb(main):032:3> end
psieve.rb(main):033:2> end
psieve.rb(main):034:1> end
=> :sieve
psieve.rb(main):035:0>
psieve.rb(main):036:0>
しかし33行目(下から4番目)のend
を無効にすると構文エラーが起こり出処不明のend
を要求されます.
#!/usr/bin/env ruby
def sieve(num);
n = num;
array_seed = [];
while n > 1 do
array_seed << n;
n -= 1;
end
array_seed.reverse!;
primes = [];
while true do
array_seed_tmp = array_seed.shift;
primes << array_seed;
break if !array_seed_tmp
trashnum = [];
array_seed.each do |x|
trashnum << x; if x % array_seed_tmp == 0
end
primes -= trashnum
end
array_string = primes.to_s;
array_string.each do |y|
print("#{y}\s");
end
#end
end
psieve.rb(main):001:0> #!/usr/bin/env ruby
=> nil
psieve.rb(main):002:0>
psieve.rb(main):003:0> def sieve(num);
psieve.rb(main):004:1>
psieve.rb(main):005:1> n = num;
psieve.rb(main):006:1> array_seed = [];
psieve.rb(main):007:1>
psieve.rb(main):008:1> while n > 1 do
psieve.rb(main):009:2* array_seed << n;
psieve.rb(main):010:2> n -= 1;
psieve.rb(main):011:2> end
psieve.rb(main):012:1>
psieve.rb(main):013:1> array_seed.reverse!;
psieve.rb(main):014:1> primes = [];
psieve.rb(main):015:1>
psieve.rb(main):016:1> while true do
psieve.rb(main):017:2* array_seed_tmp = array_seed.shift;
psieve.rb(main):018:2> primes << array_seed;
psieve.rb(main):019:2>
psieve.rb(main):020:2> break if !array_seed_tmp
psieve.rb(main):021:2>
psieve.rb(main):022:2> trashnum = [];
psieve.rb(main):023:2>
psieve.rb(main):024:2> array_seed.each do |x|
psieve.rb(main):025:3* trashnum << x; if x % array_seed_tmp == 0
psieve.rb(main):026:4> end
psieve.rb(main):027:3> primes -= trashnum
psieve.rb(main):028:3> end
psieve.rb(main):029:2> array_string = primes.to_s;
psieve.rb(main):030:2> array_string.each do |y|
psieve.rb(main):031:3* print("#{y}\s");
psieve.rb(main):032:3> end
psieve.rb(main):033:2> #end
psieve.rb(main):034:2> end
psieve.rb(main):035:1>
psieve.rb(main):036:1>
SyntaxError (psieve.rb:35: syntax error, unexpected end-of-input, expecting end)
from /usr/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
from /usr/bin/irb:23:in `load'
from /usr/bin/irb:23:in `<main>'
推測
何度も再起動したりRubyを入れ直したりしてみましたがエラーは解決されなかったのでおそらく処理系のエラーバグとは考えにくいので,自分がどこかで書き損じているのだと思います(元々はFedoraでこのような構文解析エラーに遭遇しましたが,緊急用のArchLabsでも同様のエラーが出たので)
伺いたいことを纏めると,
- 33行目のendはどこのendなのか?
ということです.
最後になりましたが,OSはFedora30とArchLabs(最新版)でRubyのバージョンが共に2.6.3です.