Ответ на этот вопрос, по большому счету , каждый вопрос дизайна языка : «Просто потому, что». Языковой дизайн - это серия преимущественно субъективных компромиссов. И для большинства этих субъективных компромиссов только правильный ответ на вопрос, почему что-то так, как есть, просто «потому что Мац сказал так».
конечно другие варианты:
+
, -
, ::
, >
, =
и т. д. являются просто нормальными именами юридических функций (фактически имена переменных), как foo
или bar?
(plus 1 2)
(+ 1 2)
2 + 3 * 4
- 20
, а не 14
. 1 plus: 2
1 + 2
*
, -
, #:::
и т. Д. Являются просто юридическими именами методов. (Фактически, они также являются легальным классом, признаком, типом и именами полей.) Любой метод может быть вызван либо с точкой, либо без нее. Если вы используете форму без точки, и метод принимает только один аргумент, вы также можете оставить скобки. Однако Scala имеет приоритет, хотя он не определяется пользователем; он просто определяется первым символом имени. В качестве добавленного твиста имена операторов-операторов, заканчивающиеся двоеточием, инвертированы или право-ассоциативны, то есть a :: b
эквивалентно b.::(a)
, а не a.::(b)
. 1.plus(2)
1 plus(2)
1 plus 2
1.+(2)
1 +(2)
1 + 2
plus 1 2
1 `plus` 2
(+) 1 2
1 + 2
Нет никакой конкретной причины, по которой Ruby не может поддерживать пользовательские операторы в стиле, подобном Scala. Там есть причина, по которой Ruby не может поддерживать произвольные методы в позиции оператора, просто потому, что
foo plus bar
уже уже юридический, и, таким образом, это быть обратным-несовместимым изменением.
Еще одна вещь, которую следует учитывать, - это то, что Ruby на самом деле не был полностью разработан заранее. Он был разработан посредством его реализации. Это означает, что во многих местах реализация протекает. Например, нет абсолютно никакой логической причины, почему
puts(!true)
является законным, но
puts(not true)
- нет. Единственная причина , почему это так, заключается в том, что Matz использовал парсер LALR (1) для анализа языка, отличного от LALR (1). Если он сначала разработал язык , он бы никогда не выбрал парсер LALR (1), и выражение было бы законным.
Функция Refinement
в настоящее время обсуждается на ruby-core
, является еще одним примером. То, как оно указано в настоящий момент, сделает невозможным оптимизировать вызовы методов и встроенные методы , даже если рассматриваемая программа фактически не использует Refinement
s вообще , С помощью простой настройки он может быть столь же выразительным и мощным, и гарантировать, что стоимость пессимизации возникает только для областей, которые на самом деле используют Refinement
s. По-видимому, единственная причина , почему была указана именно так: a) было проще прототипировать этот путь, и b) YARV не имеет оптимизатор, поэтому никто даже не потрудился подумать о последствиях (ну, кроме Чарли Оливера Нуттера).
Итак, в основном вопрос, который у вас есть о дизайне Ruby, ответ почти всегда будет либо «потому что Мац сказал так» или «потому что в 1993 году было проще реализовать этот путь».
Вы пропустили несколько вещей:
container > div
также должно быть свойство display: flex;
. item
раздел должен иметь flex-direction: column;
, а не nav
разделы. nav
нужны (согласно вашему сообщению) другие правила, чем вашему первому nav
. Я разделил их на разные классы. Я также добавил правило, гласящее, что ваш второй раздел nav
имеет width: 100%
, так что разделы внутри него должным образом сдвигаются по бокам.
.container {
display: flex;
margin: 0.75rem auto 0 auto;
max-width: 40rem;
border: 1px solid red;
flex-direction: column;
}
.container > div {
display: flex;
flex-direction: row;
align-items: flex-start;
justify-content: space-between;
margin-top: 5rem;
flex-basis: 100%;
}
.nav {
color: blue;
display: flex;
flex-direction: row;
justify-content: space-between;
}
.nav-row {
color: blue;
display: flex;
flex-direction: row;
justify-content: space-between;
width: 100%;
}
.items {
display: flex;
flex-direction: column;
align-items: center;
}
.items > * {
margin-right: 0.75rem; // to be defined as variable
text-decoration: none;
}
.items:last-child {
margin-right: 0;
}
.button {
background: red;
border-radius: .1875rem;
color: #fff;
cursor: pointer;
display: inline-block;
font-size: 1rem;
letter-spacing: .0625rem;
padding: .375rem .75rem;
}
<div class="container">
<div>
<div class="nav">
<div class="items">
<a href="">Link T1</a>
<a href="">Link T1</a>
<a href="">Link T1</a>
</div>
<div class="items">
<a href="">Link T2</a>
<a href="">Link T2</a>
<a href="">Link T2</a>
</div>
</div>
<div class="action">
<a class="button" href="/accounts/register/">Lorem </a>
</div>
<div class="form">
<form action="" method="post">
<input type="text" class="input" />
</form>
</div>
</div>
<div>
<div class="nav-row">
<div class="items">
<a href="">Link R1</a>
<a href="">Link R1</a>
<a href="">Link R1</a>
</div>
<div class="items">
<a href="">Link R2</a>
<a href="">Link R2</a>
<a href="">Link R2</a>
</div>
</div>
</div>
</div>