Объясните x => x. ToString ()//упрощают столько вызовов

CSS-селекторы немного проще, чем XPath. Для классов общий синтаксис - tag.class, и если чего-то не хватает, он соответствует всему, поэтому .article сопоставляет каждый тег с классом article. Пробел между селекторами означает поиск дочерних элементов первой части, которые соответствуют селектору второй. Итак:

library(rvest)

tz <- read_html('http://taz.de/Kongo-Kunst-im-Bruesseler-Afrikamuseum/!5563620/')

paragraphs <- tz %>% html_nodes('.sectbody p.article') %>% html_text()

str(paragraphs)
#>  chr [1:20] "TERVUREN taz | Wer dieses Jahr Belgiens berühmtes Afri­kamuseum in Tervuren vor den Toren Brüssels besucht, kom"| __truncated__ ...

paragraphs[1]
#> [1] "TERVUREN taz | Wer dieses Jahr Belgiens berühmtes Afri­kamuseum in Tervuren vor den Toren Brüssels besucht, kommt ins Staunen. Wo früher das Musée royal d’Afrique Centrale (MRAC) alte Kolonialsammlungen darbot, zelebriert heute das renovierte „Africa Museum“, wie es jetzt heißt, den Reichtum des Kongo mit all seinen hellen und dunklen Seiten."

Обратите внимание, что это работает, потому что классы в HTML разделены пробелом, поэтому class="class1 class2" будет соответствовать .class1 или .class2. Вот отличный учебник , если вы хотите больше узнать о CSS-селекторах.

7
задан Community 23 May 2017 в 12:33
поделиться

4 ответа

Когда необходимо создать экземпляр делегата, который имеет единственный параметр, лямбда-выражения позволяют, Вы для создания того делегата "встраиваете" очень кратким способом. Например, вот код для нахождения конкретного человека в списке их именем:

List<Person> list = new List<Person>();
// [..] Populate list here
Person jon = list.Find(p => p.Name == "Jon");

В C# 2.0 Вы могли использовать анонимный метод, который был многоречив, но не слишком плохо:

List<Person> list = new List<Person>();
// [..] Populate list here
Person jon = list.Find(delegate(Person p) { return p.Name == "Jon"; });

В C# 1.0 необходимо было бы создать целый дополнительный метод. Кроме того, если бы Вы хотели параметризовать его, то необходимо было бы создать другой тип, тогда как анонимные методы и лямбда-выражения получают свою среду выполнения (локальные переменные и т.д.), таким образом, они действуют как закрытия:

public Person FindByName(List<Person> list, String name)
{
    return list.Find(p => p.Name == name); // The "name" variable is captured
}

Существует больше об этом в моей статье о закрытиях.

В то время как передача делегатов в методы не ужасно распространена в C# 2.0 и.NET 2.0, это - значительная часть основания LINQ - таким образом, Вы склонны использовать его много в C# 3.0 с.NET 3.5.

21
ответ дан 6 December 2019 в 07:30
поделиться

Это в основном расширяется до:

private string Lambda(object x) {
  return x.ToString();
}
2
ответ дан 6 December 2019 в 07:30
поделиться

Действительно ли Вы знакомы с C# 2.0 анонимные методы? Эти два вызова эквивалентны (предположение, что SomeMethod принимает делегата и т.д.):

SomeMethod(x => x.ToString());

SomeMethod(delegate (SomeType x) { return x.ToString();});

Я знаю, который я ввел бы...

1
ответ дан 6 December 2019 в 07:30
поделиться
string delegate(TypeOfX x)
{
  return x.ToString();
}
0
ответ дан 6 December 2019 в 07:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: