Метод строительства дорожки кемпинга

Может ли кто-нибудь объяснить мне эту часть кода из микро-фреймворка 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",

Другие вопросы по тегам