Я не думаю, что вы можете реализовать val //= 23
, что в Perl называется "dor" (определено-или). Там нет основного вызова метода. Вместо этого val ||= 23
компилируется в ...
if !val
val = 23
end
val //= 23
будет ...
if val.nil?
val = 23
end
Вы можете найти код для этого в compile.c . Вам нужно как-то взломать анализатор, чтобы добавить новый код операции idDOROP
и изменить грамматику. Это не невозможно, это делается на Perl все время, но это очень грязно.
Я тоже не думаю, что вы можете сделать val.dor(23)
. Для этого потребуется присвоить self
, что недопустимо.
class Object
def dor(value)
self = value if self.nil?
end
end
Can't change the value of self
self = value if self.nil?
Самое близкое, что я могу придумать, это.
class Object
def dor(value)
value if self.nil?
end
end
obj = obj.dor(42)
puts obj
Что является сомнительным улучшением по сравнению с ...
obj = 42 if obj.nil?
puts obj
Как правило, //=
не требуется в Ruby. //=
появился в Perl, потому что Perl считает 0
и ""
ложными. Во многих случаях это допустимые значения, но они будут стерты $var ||= $default
. Люди устали писать $var = $default if !defined $var
и //=
родился.
В Ruby есть только два ложных значения, nil
и false
. Все остальное правда. var ||= default
будет делать правильные вещи с 0
и ""
, поэтому нет необходимости в //=
.
Если ваш дизайн требует регулярного различения nil
и false
достаточно часто, чтобы написать нового оператора, измените ваш дизайн.