Quellcode durchsuchen

Merge pull request #3847 from FX-HAO/master

Google::Protobuf::Struct can access a missing key (#3846)
Joshua Haberman vor 7 Jahren
Ursprung
Commit
e00266a74e

+ 6 - 0
ruby/lib/google/protobuf/well_known_types.rb

@@ -155,6 +155,8 @@ module Google
     Struct.class_eval do
       def [](key)
         self.fields[key].to_ruby
+      rescue NoMethodError
+        nil
       end
 
       def []=(key, value)
@@ -176,6 +178,10 @@ module Google
         hash.each { |key, val| ret[key] = val }
         ret
       end
+
+      def has_key?(key)
+        self.fields.has_key?(key)
+      end
     end
 
     ListValue.class_eval do

+ 6 - 0
ruby/tests/well_known_types_test.rb

@@ -60,6 +60,9 @@ class TestWellKnownTypes < Test::Unit::TestCase
     assert_equal(Google::Protobuf::ListValue.from_a(sublist),
                  struct["sublist"])
 
+    assert_equal true, struct.has_key?("null")
+    assert_equal false, struct.has_key?("missing_key")
+
     should_equal = {
       "number" => 12345,
       "boolean-true" => true,
@@ -82,6 +85,9 @@ class TestWellKnownTypes < Test::Unit::TestCase
     # to_h returns a fully-flattened Ruby structure (Hash and Array).
     assert_equal(should_equal, struct.to_h)
 
+    # Test that we can safely access a missing key
+    assert_equal(nil, struct["missing_key"])
+
     # Test that we can assign Struct and ListValue directly.
     struct["substruct"] = Google::Protobuf::Struct.from_hash(substruct)
     struct["sublist"] = Google::Protobuf::ListValue.from_a(sublist)