Apakah Ruby memiliki metode bawaan untuk melepaskan diri dari dan string yang tidak dapat dilepaskan? Di masa lalu, saya telah menggunakan ekspresi reguler; namun, saya berpikir bahwa Ruby mungkin melakukan konversi seperti itu secara internal sepanjang waktu. Mungkin fungsionalitas ini terekspos di suatu tempat.
Sejauh ini saya telah menemukan fungsi-fungsi ini. Mereka bekerja, tetapi mereka tampak sedikit rumit:
def escape(s)
s.inspect[1..-2]
end
def unescape(s)
eval %Q{"#{s}"}
end
Apakah ada cara yang lebih baik?
Ada banyak metode untuk melarikan diri, beberapa di antaranya:
# Regexp escapings
>> Regexp.escape('\*?{}.')
=> \\\*\?\{\}\.
>> URI.escape("test=100%")
=> "test=100%25"
>> CGI.escape("test=100%")
=> "test%3D100%25"
Jadi, ini benar-benar tergantung pada masalah yang harus Anda selesaikan. Tetapi saya akan menghindari penggunaan inspect untuk melarikan diri.
Update - ada sebuah dump, inspect menggunakannya, dan sepertinya itulah yang Anda butuhkan:
>> "\n\t".dump
=> "\"\\n\\t\""
Pemutakhiran: Saya tidak lagi setuju dengan jawaban saya sendiri, tetapi saya lebih memilih untuk tidak menghapusnya karena saya menduga orang lain mungkin akan menempuh jalan yang salah, dan sudah ada banyak diskusi tentang jawaban ini dan alternatifnya, jadi saya pikir jawaban ini masih berkontribusi dalam percakapan, tetapi tolong jangan gunakan jawaban ini dalam kode yang sebenarnya.
Jika Anda tidak ingin menggunakan eval
, tetapi ingin menggunakan modul YAML
, Anda dapat menggunakannya sebagai gantinya:
require 'yaml'
def unescape(s)
YAML.load(%Q(---\n"#{s}"\n))
end
Keuntungan menggunakan YAML
dibanding eval
adalah bahwa ia lebih aman. cane
melarang semua penggunaan eval
. Saya telah melihat rekomendasi untuk menggunakan $SAFE
bersama dengan eval
, tetapi itu tidak tersedia melalui JRuby saat ini.
Untuk apa yang layak, Python memang memiliki dukungan asli untuk unescaping backslashes.
Ruby ' s inspect
dapat membantu:
"a\nb".inspect
=> "\"a\\nb\""
Biasanya jika kita mencetak sebuah string dengan sebuah embedded line-feed, kita akan mendapatkan:
puts "a\nb"
a
b
Jika kita mencetak versi yang diperiksa:
puts "a\nb".inspect
"a\nb"
Tetapkan versi yang diperiksa ke sebuah variabel dan Anda akan mendapatkan versi yang keluar dari string tersebut.
Untuk membatalkan pelarian, eval
string tersebut:
puts eval("a\nb".inspect)
a
b
Saya tidak terlalu suka melakukannya dengan cara ini. Ini lebih merupakan rasa ingin tahu daripada sesuatu yang saya lakukan dalam praktik.