Краткий ответ: удалить время жизни 'a
для параметра self
параметра split_first
: fn split_first(&self) -> &'a str
( детская площадка ).
Длинный ответ:
Когда вы пишете этот код:
struct Foo<'a> {
part: &'a str,
}
impl<'a> Foo<'a> {
fn new(s: &'a str) -> Self {
Foo { part: s }
}
}
Вы говорите компилятору, что все Foo
экземпляры связаны с некоторым временем жизни [ 118], которое должно быть равно или короче времени жизни строки, передаваемой в качестве параметра в Foo::new
. Это время жизни 'a
может отличаться от времени жизни каждого экземпляра Foo
. Затем вы пишете:
let words = "Sometimes think, the greatest sorrow than older";
Foo::new(words)
Компилятор делает вывод, что время жизни 'a
должно быть равно или короче времени жизни words
. Запретив любые другие ограничения, компилятор будет использовать время жизни words
, которое равно 'static
, поэтому оно действует в течение всего срока службы программы.
Когда вы добавляете определение split_first
:
fn split_first(&'a self) -> &'a str
Вы добавляете дополнительное ограничение: вы говорите, что 'a
также должно быть равно или короче времени жизни self
, Поэтому компилятор будет принимать меньшее время жизни words
и время жизни временного экземпляра Foo
, то есть время жизни временного экземпляра. @ Ответ AndersKaseorg объясняет, почему это не работает.
Удаляя время жизни 'a
для параметра self
, я декоррелирую 'a
из времени жизни временного, поэтому компилятор может снова сделать вывод, что 'a
- это время жизни words
, которое достаточно долго для работы программы.
public static int Weekday(DateTime dt, DayOfWeek startOfWeek)
{
return (dt.DayOfWeek - startOfWeek + 7) % 7;
}
С помощью это можно назвать:
DateTime dt = DateTime.Now;
Console.WriteLine(Weekday(dt, DayOfWeek.Friday));
Вышеупомянутые выводы:
4
поскольку вторник спустя 4 дня после пятницы.
Я не думаю, что существует эквивалент двух форм аргумента Будней функции VB.
Вы могли эмулировать его с помощью чего-то вроде этого;
private static int Weekday(DateTime date, DayOfWeek startDay)
{
int diff;
DayOfWeek dow = date.DayOfWeek;
diff = dow - startDay;
if (diff < 0)
{
diff += 7;
}
return diff;
}
Затем называя его как так:
int i = Weekday(DateTime.Now, DayOfWeek.Friday);
Это возвращается 4 на сегодняшний день, как вторник спустя 4 дня после пятницы.
Да, Каждое значение DateTime имеет созданный в свойстве под названием DayOfWeek, который возвращает перечисление того же имени...
DayOfWeek dow = DateTime.Now.DayOfWeek;
Если Вы хотите интегральное значение, просто бросает перечислимую величину к интервалу.
int dow = (int)(DateTime.Now.DayOfWeek);
Необходимо будет добавить константу от 1 до 6 и сделать Модификацию 7 для перестройки ее к другому дню помимо воскресенья, однако...