s = r'abc123d, hello 3.1415926, this is my book'
print re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s)
Вам не нужно escape
дважды, когда вы используете raw mode
.
Выход: ['123', '3.1415926']
Также тип возврата будет списком strings
.Если вы хотите, чтобы возвращаемый тип, как integers
и floats
, использовал map
import re,ast
s = r'abc123d, hello 3.1415926, this is my book'
print map(ast.literal_eval,re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s))
Выход: [123, 3.1415926]
В Kotlin ссылки на функции создаются с помощью оператора ::
(не .
).
Ваш предполагаемый прецедент может быть легко достигнут с помощью этого:
val eventHandlers: HashMap<RemoteEvent, (bytes: ByteArray) -> Unit> = hashMapOf(
0x01 to foo::handleEvent,
0x02 to bar::handleEvent)
// ^
Ссылки на функции , Kotlin docs
foo.handleEvent
интерпретируются как доступ к свойству , называемому handleEvent
(которого не существует.)
foo::handleEvent
является экземпляром KFunction
, представляющим функцию, называемую handleEvent
, и поскольку это соответствует лямбда-сигнатуре (ByteArray) -> Unit
, она работает как ожидалось.
Обратите внимание, что это отличается от например C # или C ++, где из-за языковых ограничений методы и свойства / поля не могут использовать одно и то же имя. На этих языках .
отлично подходит для групп методов / указателей функций, потому что невозможно foo.bar
быть неоднозначным.
Без замыканий выражение оценивается (вызывается) в строке.
Закрытие создает анонимный объект с определенным методом (в пределах замыканий), который может быть вызван при необходимости.
Только исключение когда функция, потребляющая лямбда, объявляется как inline
, и в этом случае весь функциональный блок вводится в место вызова, включая лямбда (для предотвращения генерации объекта).