あるメソッドの内部処理が「ダメだった」場合に空のオブジェクトを返すかnilを返すか自作例外を発生させるかの定まった回答はない
そのメソッドやクラスがどういう場面で使用されるか、をよく考えた上で自分で決めるしかない

B#keysが[]を返すのは、空のHashに対するHash#keysが[]を返すことからの類推と、
そのB#[]の作者が[]メソッドに照会の機能を持たせてるからだと思う
メソッドの戻り値の内容はこっちで吟味するからとりあえず配列を返しといて下さい、という