Qual é o objetivo do operador de ponto de interrogação no Ruby?
Às vezes, aparece assim:
assert !product.valid?
às vezes está em uma if
construção.
Qual é o objetivo do operador de ponto de interrogação no Ruby?
Às vezes, aparece assim:
assert !product.valid?
às vezes está em uma if
construção.
Respostas:
É uma convenção de estilo de código; indica que um método retorna um valor booleano.
O ponto de interrogação é um caractere válido no final de um nome de método.
?
in Ruby (é um operador ternário, convertendo um caractere em seu número inteiro ASCII, uso test
em RegEx'es etc.), muitos dos quais são abordados nas outras respostas aqui.
isEmpty()
, isDigit()
etc. Em Ruby, os mesmos métodos seria escrito empty?
, e digit?
que é um pouco mais agradável IMO.
is
o tempo todo. Isso pode ser super confuso para alguém vindo de Swift desde o ponto de interrogação não é usado para nullable
:)
Observe também que, ?
juntamente com um caractere, retornará o código de caractere ASCII paraA
Por exemplo:
?F # => will return 70
Como alternativa no ruby 1.8, você pode:
"F"[0]
ou em ruby 1.9:
"F".ord
Observe também que ?F
retornará a string "F"
; portanto, para tornar o código mais curto, você também pode usar ?F.ord
no Ruby 1.9 para obter o mesmo resultado que "F".ord
.
'F'
No seu exemplo, é apenas parte do nome do método. No Ruby, você também pode usar pontos de exclamação nos nomes dos métodos!
Outro exemplo de pontos de interrogação no Ruby seria o operador ternário.
customerName == "Fred" ? "Hello Fred" : "Who are you?"
No seu exemplo
product.valid?
É realmente uma chamada de função e chama uma função chamada valid?
. Certos tipos de "teste para condição" / funções booleanas têm um ponto de interrogação como parte do nome da função por convenção.
Vale a pena ressaltar que ?
s são permitidos apenas nos nomes dos métodos, não nas variáveis. No processo de aprendizado de Ruby, assumi que ?
designava um tipo de retorno booleano, então tentei adicioná-los a variáveis de flag, levando a erros. Isso me levou a acreditar erroneamente por um tempo que havia alguma sintaxe especial envolvendo ?
s.
Relevante: Por que um nome de variável não pode terminar com `?` Enquanto um nome de método pode?
Eu acredito que é apenas uma convenção para coisas que são booleanas. Um pouco como dizer " IsValid
".
Também é usado em expressões regulares, significando "no máximo uma repetição do caractere anterior"
por exemplo, a expressão regular /hey?/
corresponde às cadeias " he
" e " hey
".
Também é uma convenção comum usar com o primeiro argumento do método de teste do Kernel # test
irb(main):001:0> test ?d, "/dev" # directory exists?
=> true
irb(main):002:0> test ?-, "/etc/hosts", "/etc/hosts" # are the files identical
=> true
como visto nesta pergunta aqui
test
, ?d
é um atalho para "d"
. test
usa uma string de um caractere como seu primeiro argumento, para que você possa chamá-la com test ?d, "/dev"
ou test "d", "/dev"
.