Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
function Cook($ingredientOne, $ingredientTwo, $function)
{
echo "get the $ingredientOne";
$function($ingredientOne);
$function($ingredientTwo);
}
Cook(“lobster”, “water”, "PutInPot");
Cook(“chicken”, “coconut”, "BoomBoom");
у параметров функций надобно указывать типы; у возвращаемого функцией значения надобно указывать тип;Это плата за статическую типизацию и более быструю работу приложения.
если функция статическая (static) и доступная (public), то это также надобно указывать;Это плата за ООП. ООП действительно не нужно в маленьких приложениях, но C# — язык для чуть более серьезных дел.
приходится использовать Console.WriteLine(string.Format("…", …)) вместо alert() и строковой конкатенации;Строковая конкатенация до сих пор работает:
Console.WriteLine("a * b = " + a * b). И потом, string.Format у вас лишний. Console.WriteLine("a * b = {0:0.00}", a * b) — автоматически использует string.Format. По поводу того, что нельзя никак (даже с помощью спец.оператора) использовать WriteLine вместо Console.WriteLine — ну да, немного фэйл в языке, хотя это не так уж и плохо, тем более учитывая наличие IntelliSense это вообще не проблема.Это плата за статическую типизацию и более быструю работу приложения.Автоматический вывод типов? Нет, не слышал…
но вам в это случае все равно прийдется определить такую функцию где-то
'abc'[1]; // 'b'
'abc'[0][0][0][0][0][0]; // 'a'
Java требует от вас создания целого объекта с одним методом, называемым функтором, если вы вдруг захотите использовать функции как объекты первого класса. А принимая во внимание что в большинстве ОО языков заведено для каждого класса создавать отдельный файл, все очень быстро становится крайне неуюклюжим.
#!/usr/bin/perl -w
use strict;
$_='ev
al("seek\040D
ATA,0, 0;");foreach(1..3)
{<DATA>;}my @camel1hump;my$camel;
my$Camel ;while( <DATA>){$_=sprintf("%-6
9s",$_);my@dromedary 1=split(//);if(defined($
_=<DATA>)){@camel1hum p=split(//);}while(@dromeda
ry1){my$camel1hump=0 ;my$CAMEL=3;if(defined($_=shif
t(@dromedary1 ))&&/\S/){$camel1hump+=1<<$CAMEL;}
$CAMEL--;if(d efined($_=shift(@dromedary1))&&/\S/){
$camel1hump+=1 <<$CAMEL;}$CAMEL--;if(defined($_=shift(
@camel1hump))&&/\S/){$camel1hump+=1<<$CAMEL;}$CAMEL--;if(
defined($_=shift(@camel1hump))&&/\S/){$camel1hump+=1<<$CAME
L;;}$camel.=(split(//,"\040..m`{/J\047\134}L^7FX"))[$camel1h
ump];}$camel.="\n";}@camel1hump=split(/\n/,$camel);foreach(@
camel1hump){chomp;$Camel=$_;y/LJF7\173\175`\047/\061\062\063\
064\065\066\067\070/;y/12345678/JL7F\175\173\047`/;$_=reverse;
print"$_\040$Camel\n";}foreach(@camel1hump){chomp;$Camel=$_;y
/LJF7\173\175`\047/12345678/;y/12345678/JL7F\175\173\0 47`/;
$_=reverse;print"\040$_$Camel\n";}';;s/\s*//g;;eval; eval
("seek\040DATA,0,0;");undef$/;$_=<DATA>;s/\s*//g;( );;s
;^.*_;;;map{eval"print\"$_\"";}/.{4}/g; __DATA__ \124
\1 50\145\040\165\163\145\040\157\1 46\040\1 41\0
40\143\141 \155\145\1 54\040\1 51\155\ 141
\147\145\0 40\151\156 \040\141 \163\16 3\
157\143\ 151\141\16 4\151\1 57\156
\040\167 \151\164\1 50\040\ 120\1
45\162\ 154\040\15 1\163\ 040\14
1\040\1 64\162\1 41\144 \145\
155\14 1\162\ 153\04 0\157
\146\ 040\11 7\047\ 122\1
45\15 1\154\1 54\171 \040
\046\ 012\101\16 3\16
3\15 7\143\15 1\14
1\16 4\145\163 \054
\040 \111\156\14 3\056
\040\ 125\163\145\14 4\040\
167\1 51\164\1 50\0 40\160\
145\162 \155\151
\163\163 \151\1
57\156\056
var list = new List<int> { 1, 2, 3 };
for (var i = 0; i < list.Count; i++)
{
list[i] = list[i] * 2;
}
foreach (var el in list)
{
Alert(el.ToString());
}
foreach (var el in Enumeration.Range(1, 3).Select(i => i*2))
{
Alert(el.ToString());
}
Enumeration.Range(1, 3).Select(i => i*2).ToList().ForEach(el => Alert(el.ToString()));
public static int Sum(IEnumerable<int> list)
{
return Reduce((x, y) => x + y, list, 0);
}
public static string Join(IEnumerable<string> list)
{
return Reduce((a,b) => a + b, list, string.Empty);
}
sum = foldl1 (+)
join = foldl1 (^)
(1..5).inject(:+) public static class Extensions
{
public static T inject<T>(this T[] array, Func<T, T, T> func)
{
T result = default(T);
foreach (T item in array) result = func(result, item);
return result;
}
}
Console.WriteLine(list.Aggregate("", (s, element) => s + element));
Console.WriteLine(list.Aggregate(0 , (s, element) => s + element));
persons
.Where(person => person.Age > 18 && person.Gender == Gender.Female)
.Select(person => person.Address)
var address = from person in persons
where person.Age > 18 && person.Gender == Gender.Female
select person.Address;
var address = from person in persons
where person.Age > 18 && person.Gender == Gender.Female
select person.Address;
var adress = new List<string>();
foreach(var person in persons)
{
if(person.Age > 18 && erson.Gender == Gender.Female)
{
adress.Add(person.address)
}
}
IEnumerable<string> getAddresses(Func<Person, bool> query)
{
return persons
.Where(Query)
.Select(person => person.Address);
}
adressesOfWomen = getAddresses(p =>p.Gender=Gender.Female);
adressesOfChildren = getAddresses(p => p.Age < 18);
//и так далее
for($i=0;$i<len($array);$i++) {//...} то либо заставляет задуматься лишний раз («имеет ли значение порядок и направление перебора»), либо может послужить причиной того, что не задумался когда нужно было, читая код — конструкция воспринимается как единое целое именно перебора с безразличным порядком, в детали не вдаёшься и решаешь оптимизировать скажем так for($i=len($array); $i; $i++) {//...} не обращая внимания на то, что порядок перебора был важен Console.WriteLine(“get the lobster”);
PutInPot(“water”);
PutInPot(“lobster”);
Cook(“lobster”, “water”, PutInPot);
Cook("lobster",
"water",
x => Alert("pot " + x));
Cook(
"lobster",
"water",
x => Alert("pot " + x)
);
Map((x) => x * 2, list);if (something > 0) { ... }
IsPositive(something)
list.Where(item => item > 0)
if (something > 0) {… } — значит у вас уже проблемы и без использования LINQ/Enumerable-расширений. Однако во втором выражении использование типа var обязательно, потому что результатом является коллекция анонимных типов и имя этого типа является доступным только для компилятора
list.Where(item => item > 0), а не temperatures.Where(temperature => temperature > 0) или weatherInfoCollection.Where(weatherInfo => weatherInfo.temperature > 20 && weatherInfo.brightness > 20)? Т.е. я имею в виду, вы не знаете, что в лямбда-функциях мы можем как угодно именовать входные аргументы?var firstExample = list.Where((int x) => x > 0); // указываем тип аргумента
var secondExample = list.Where(new Func<int, bool>((int x) => x > 0)); // указываем тип результата вычисления лямбды и еще дважды аргумента
var thirdExample = list.Where(new Func<int, bool>(x => x > 0)); // тип результата вычисления лямбды и аргументов.
var fourthExample = list.Where((int x) => (bool)(x > 0)); // или так // приведение к типу мешает компилятору скомпилировать неправильный код
List<int> fifthExample = new List<int>().Where((int x) => (bool)(x > 0)).ToList(); // да указывайте что угодно, только зачем?
Таким образом нужно вводить Сalendar.GetGoodDay(). Вот тогда это будет объектно.
weatherInfoCollection.Where(weatherInfo => weatherInfo.temperature > 20 &&
weatherInfo.brightness > 20);
static class WeatherInfoExtension { //
// <...> одна пустая строка отделяет эту функцию от остальных функций сверху
/// <summary>
/// Returns true if day temperature is greater than 20 C and day brightness greater than 20 L and false in other cases.
/// </summary>
public static bool IsGoodDay(this WeatherInfo weatherInfo) {
return weatherInfo.temperature > 20 &&
weatherInfo.brightness > 20;
}
// <...> одна пустая строка отделяет эту функцию от остальных функций снизу
}List<WeatherInfo> goodDays = new List<WeatherInfo>();
foreach(WeatherInfo weatherInfo in weatherInfoCollection)
if (weatherInfo.IsGoodDay())
goodDays.Add(weatherInfo)До этого мы говорили не о библиотеке!Ну и что, что не говорили? Язык/.NET не только для вас родного пишется, а для всех программистов, а у них потребности разнообразные.
Если бы это была библиотека — то нужно использовать нормальный SQL в виде строки, а не этот ужас псевдо-SQL`a. В любом случае, требовать от пользователя библиотеки использовать LINQ — это маразм.Ага, т.е. заставлять юзера использовать SQL там где он не нужен (а я вам описывал случаи, когда синтаксис LINQ удобен, но совать туда SQL нельзя — список задач (taskmgr.exe), список файлов/каталогов (файловый менеджер), содержимое архива (архиватор)). А если у нас библиотека делает что-то другое, например, лениво вычисляет простые числа? Тоже туда совать лишний слой в виде SQL?
время_работы_метода = константа * N.
Может ли ваш язык программирования делать такое?