Много проблем. То, о чем вы спрашиваете: Кристалл очень самоуверен в отношении дела. Методы должны начинаться со строчной буквы; ваш начинается с заглавных букв, что Crystal не нравится вообще. Некоторые другие проблемы:
{} of Int32 : Int32
должны использовать толстую стрелку, а не двоеточие: {} of Int32 => Int32
if
утверждение не делает заканчивается двоеточием, это не Python.
Нет метода с именем key?
; использование has_key?
fetch
(в текущей версии Crystal) требует либо блока, либо второго аргумента, который задает значение по умолчанию; если вам не нужно указывать поведение по умолчанию (а вы не проверяете, существует ли ключ), вы можете просто использовать []
.
Я действительно не уверен, для чего предназначен код, поэтому я не могу комментировать логику, семантику и стиль; но вот ваш код без синтаксических ошибок:
def twosum(a = [] of Int32, target = 0)
map = {} of Int32 => Int32
a.each_index do |i|
diff = target - a[i]
if map.has_key?(diff)
return [map[diff], i]
elsif
map[a[i]] = i
end
end
return 0
end
a = [1, 4, 6, 3]
target = 7
puts(twosum(a, target))
Хм... ($lotr=$hobbit) =~ s/Bilbo/Frodo/g
одно из многого волшебства Perl. Теперь для некоторых ответов.
Q1) $lotr
присваивается значение, содержавшееся в $hobbit
. После присвоения мы можем забыть об исходной переменной. Обработка ($lotr = $hobbit)
как свой собственный оператор, как будто мы записали:
$lotr = $hobbit;
$lotr =~ s/Bilbo/Frodo/g;
вместо этого. regex воздействует на $lotr
.
Q2), синтаксис является просто короткой версией отрывка, данного выше. Думайте о нем как о "копии строка от $a
, скопируйте его в $b
, и измените $b
с regex" вместо "берут строку от $a
, измените его с regex, результатом места в $b
"
Q3) я предполагаю, что Вы имеете в виду пространство поиска шаблона по умолчанию "переменной значения по умолчанию цикла"? В этом случае просто используйте $_
вместо $hobbit
:
while (<>) {
chomp;
($lotr = $_) =~ s/Bilbo/Frodo/g;
print "\$lotr = [$lotr]\n";
print "\$_ = [$_]\n";
}
Интересно достаточно, волшебный var $_
не изменяется этой операцией. Это - то, как можно прийти к заключению, что присвоение происходит перед regex заменой и что замена не взаимодействует на пространстве шаблона по умолчанию всегда.
И для опытной вещи программистов Perl... Я не знаю слишком много людей, которые брошены некоторой частью синтаксиса Perl независимо от того, сколько времени они уставились на него 'cept г-н Schwartz, конечно, ;)
Различные языки делают разные вещи с оператором присваивания. В некоторых это - оператор, не выражение, так не может быть объединен в большее выражение. В некоторых это возвращает присвоенное значение, но только как значение (часто названный rvalue), не как что-то, что само может быть изменено или присвоено (lvalue). Примером этого является C, где можно записать:
a = b = c; # assign value of c to b and a
но нет:
++(b = a); # assign value of a to b, then increment b
И в некоторых, результатом присвоения является lvalue, присвоенный. (В Perl это применяется только к скалярным присвоениям; присвоения списка являются более сложным зверем.), Таким образом, можно сделать ++ ($b=$a) или ($b=$a) = ~ s/a/b/или любая другая операция, которая ожидает lvalue на присвоении, и оно будет сначала делать уроки и затем далее изменять lvalue, присвоенный.
Если в Q2 Вы означаете брать подстроку от $a, Вы могли бы найти эту идиому полезной:
($b) = $a =~ /(substring-to-match)/;
$b =~ s/regex-on-susbtring/result-string/;
Также обратите внимание, что $a и $b не являются нормальными переменными в Perl, так как им связали специальные правила объема с функцией вида. См. 'perldoc perlvar' для деталей.