I feel that this if/else block (and the similar block in ```calc_spare```) are a little repetitive and doing very similar things.  Both these blocks are checking whether the value is a String or a Number and scoring as appropriate, so it could make sense to split that into a new method, something like:

```
  def score_look_ahead(value)
    if value.is_a? Numeric
      value
    elsif value.is_a? String
      10
    else
      0
    end
  end
```
Then you could replace the whole if/elsif/end whole block with something like:
```
      @score += 10 + score_look_ahead(look_ahead[0]) + score_look_ahead(look_ahead[1])
```
The ```calc_spare``` method could be simplified to use this new code too, so it would become:
```
  def calc_spare
    look_ahead = @frames[@nxt]   # look ahead at the next frame

    @score += 10 + score_look_ahead(look_ahead)
end
```

(I'm sure it could be refactored further too!)