3

インデックスを使用すると、奇妙な動作が発生します。

#Defined in the class's initialize    
@my_list = [] of Type

index = @my_list.index { |i| i.value == 2 } # => 0

@my_list[0] # => 2
@my_list[index] # => error

エラーが発生します:

タイプ (Int32 | Nil) の 'Array(Type)#[]' に一致するオーバーロードはありません

インデックス = 0 であるため、インデックスが機能しない理由がわかりません。

編集:

詳しくは。私がこれを行う場合:

if index == nil
  #Do something
#error => undefined method '>=' for Nil (compile-time type is (Int32 | Nil))
elsif index >= 0
  #Do something else
end

私は理解しています。nil の可能性もありますが、既に nil かどうかを確認しているので、ここで問題はないはずです。前のコード スニペットでも同じ問題が発生していると思います。

4

4 に答える 4

3

問題は、Array#index が nilable であることです。何も見つからずに nil を返す可能性があるため、Int32|Nil ユニオンを返します。

Array#[] は Int32 引数を想定しているため、コンパイラは最終的に失敗しますが、Int32|Nil を渡します。たとえば、戻り値が真であるかどうかを確認して、このケースに注意する必要があります (後のバグを回避するため)。

于 2016-11-21T12:38:17.527 に答える
0

私はこれを行うつもりです:

def get_index(val)
  i = 0
  while i < @my_list.size
    if @my_list[i].value == val
       return i
    end

    i += 1
  end

  return -1
end

この方法では int 値のみが返され、nil は返されません。それはうまくいくようです。

于 2016-11-19T18:36:41.440 に答える
0

より良い方法は、timesよりシンプルで明確なメソッドを使用することです:

def get_index(val)
  @my_list.size.times do |i|
    return i if @my_list[i] == val
  end
  -1
end

UPD

またはより単純な

def get_index(val)
  @my_list.index { |value| value == val } || -1
end
于 2016-11-20T18:55:39.600 に答える