我有一些字串輸入,我想驗證它是否是有效的 Ruby 符號文字。如果是,則將其轉換為 Symbol。否則回傳傳遞的字串。
例子,
def parse_symbol(str)
... # Validate and convert to Symbol
# Return Symbol if valid Symbol literal
# Otherwise return str
end
input1 = ':foo_bar' #=> Valid Symbol
parse_symbol(input1) #=> :foo_bar
input2 = ':"foo bar"' #=> Valid Symbol
parse_symbol(input2) #=> :"foo bar"
input3 = ':foo bar' #=> Invalid
parse_symbol(input3) #=> :foo bar
input4 = '::"foo_bar"' #=> Invalid
parse_symbol(input4) #=> ::"foo_bar"
... # all other possible valid and invalid symbol literal goes here
str.to_sym # 將每個字串轉換為 Symbol 形式
編輯
就是eval在這里使用昂貴的工具?
eval(str).is_a?(Symbol) 救援 str
uj5u.com熱心網友回復:
我建議為此使用真正的決議器。
require 'parser/current'
require 'minitest/autorun'
def parse_symbol(str)
ast = Parser::CurrentRuby.parse(str)
if ast.type == :sym
ast.children[0]
else
str
end
rescue Parser::SyntaxError
str
end
class TestAnswer < Minitest::Test
def test_1
assert_equal :foo_bar, parse_symbol(':foo_bar')
end
def test_2
assert_equal :"foo bar", parse_symbol(':"foo bar"')
end
def test_3
assert_equal ":foo bar", parse_symbol(':foo bar')
end
def test_4
assert_equal '::"foo_bar"', parse_symbol('::"foo_bar"')
end
end
uj5u.com熱心網友回復:
def parse_symbol(str)
result = str.scan /^\:(([a-zA-Z_] [a-zA-Z0-9_]*)|\"([a-zA-Z0-9_\- ] )\")$/
return str unless !result.empty?
if !result[0][1].nil?
result[0][1].to_sym
else
result[0][2].to_sym
end
end
uj5u.com熱心網友回復:
使用這樣的正則運算式。
def parse_symbol(str)
if str ~= /:([^:\s] ||"[^:] ")/
return str.to_sym
else
return str
end
end
就是
eval在這里使用昂貴的工具?
它可能不會那么昂貴,但根據此輸入的來源,它可能很危險。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/331806.html
標籤:红宝石
上一篇:顯示選擇收集哈希ActiveRecord-RubyonRails
下一篇:如何對整數字串陣列求和?
