Метод строительства дорожки кемпинга
Может ли кто-нибудь объяснить мне эту часть кода из микро-фреймворка Lucky Stiff's Camping:
# Simply builds a complete path from a path +p+ within the app. If your
# application is mounted at <tt>/blog</tt>:
#
# self / "/view/1" #=> "/blog/view/1"
# self / "styles.css" #=> "styles.css"
# self / R(Edit, 1) #=> "/blog/edit/1"
#
def /(p); p[0] == ?/ ? @root + p : p end
2 ответа
def /(p);
Имя метода '/', который получает параметр 'p'
p[0] == ?/
проверьте, начинается ли строка с "/". Знак вопроса используется, чтобы указать, что символ используется буквально. Вы также можете считать это так же, как "/"
p[0] == ?/ ? exp1:exp2
Второй знак вопроса предназначен для условной оценки. Если выражение (p[0] ==?/) Истинно, тогда вычислить exp1, иначе вычислить exp2.
Таким образом, в приведенном выше случае, если строковый параметр начинается с символа '/', тогда возвращается значение @root + p, то есть перед ним стоит root. С другой стороны, если параметр не начинается с символа '/', тогда верните его как таковой.
Вот еще один способ написать это:
def /(p)
if p[0] == ?/
@root + p
else
p
end
end
p[0]
возвращает первый символ в строке. ?/
возвращает /
персонаж. Обратите внимание, что в 1.8 символ представлен целым числом (?/ == 47
) в то время как в 1.9 это строка из одного символа (?/ == "/"
). Тем не менее, p[0]
всегда будет соответствовать ?/
,
Таким образом, на более высоком уровне, он проверяет, является ли первый символ в строке косой чертой, если это так, он предшествует @root
(который установлен в Camping::Base#initialize) к нему.
Так что если ваше приложение смонтировано в /blog, @root == "/blog"
а также self / "/post/1" == "/blog/post/1"
,