JSONとして数値を返したい時によく+0
とかしてたけど,こっちの方が意図が明確になって良さそう.
JSON::Types
の実装方法を確認しているときに,JSON::Types::bool
が気になった
sub bool($) {
$_[0] ? \1 : \0;
}
なぜ1,0のreferenceを返してるのか.その答えはJSON::PP::value_to_json
の中にあった.
sub value_to_json {
my ($self, $value) = @_;
# 省略
my $type = ref($value);
if(!$type){
return string_to_json($self, $value);
}
elsif( blessed($value) and $value->isa('JSON::PP::Boolean') ){
return $$value == 1 ? 'true' : 'false';
}
elsif ($type) {
if ((overload::StrVal($value) =~ /=(\w+)/)[0]) {
return $self->value_to_json("$value");
}
if ($type eq 'SCALAR' and defined $$value) {
return $$value eq '1' ? 'true'
: $$value eq '0' ? 'false'
: $self->{PROPS}->[ P_ALLOW_UNKNOWN ] ? 'null'
: encode_error("cannot encode reference to scalar");
}
# 省略
}
else {
# 省略
}
}
JSON::PP::Boolean
か\1
, \0
を渡すとtrue
, false
にしてくれる模様.
ちなみにJSON::PP::Boolean
の生成方法
$JSON::PP::true = do { bless \(my $dummy = 1), "JSON::PP::Boolean" };
$JSON::PP::false = do { bless \(my $dummy = 0), "JSON::PP::Boolean" };
0 件のコメント:
コメントを投稿