Qual é o objetivo do operador de ponto de interrogação no Ruby?
Às vezes, aparece assim:
assert !product.valid?
às vezes está em uma ifconstruçã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 ifconstruçã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 testem 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.
iso 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 ?Fretornará a string "F"; portanto, para tornar o código mais curto, você também pode usar ?F.ordno 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". testusa uma string de um caractere como seu primeiro argumento, para que você possa chamá-la com test ?d, "/dev"ou test "d", "/dev".