Skip to content

Instantly share code, notes, and snippets.

@a-suenami
Last active June 30, 2019 03:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save a-suenami/5c0a02488a0e679c01eb0d5402e71dec to your computer and use it in GitHub Desktop.
Save a-suenami/5c0a02488a0e679c01eb0d5402e71dec to your computer and use it in GitHub Desktop.
Sorbet sample
# typed: strong
class SorbetSample
sig { params(array: T::Array[MyInteger]).void }
def initialize(array)
@array = T.let(array, T::Array[MyInteger])
end
sig { returns(Integer) }
def use_array_of_premitive_types
array = T.let([1,2,3], T::Array[Integer])
array.reduce(0) do |memo, item|
memo + item
end
end
sig { returns(MyInteger) }
def use_array_of_self_defined_types
array = T.let(
[
MyInteger.new(1),
MyInteger.new(2),
MyInteger.new(3),
],
T::Array[MyInteger]
)
array.reduce(MyInteger.new(0)) do |memo, item|
memo + item
end
end
sig { returns(MyInteger) }
def use_instance_variables
@array.reduce(MyInteger.new(0)) do |memo, item|
memo + item
end
end
# ここより上は静的検査できてるっぽい
# これができない
sig { returns(MyInteger) }
def use_another_self_defined_type
array = T.let(
[
MyStruct.new(n: MyInteger.new(1)),
MyStruct.new(n: MyInteger.new(2)),
MyStruct.new(n: MyInteger.new(3)),
],
T::Array[MyStruct]
)
array.reduce(MyInteger.new(0)) do |memo, item|
memo + item.n
end
end
# これならできる (reduce -> each)
sig { returns(MyInteger) }
def use_another_self_defined_type2
array = T.let(
[
MyStruct.new(n: MyInteger.new(1)),
MyStruct.new(n: MyInteger.new(2)),
MyStruct.new(n: MyInteger.new(3)),
],
T::Array[MyStruct]
)
sum = MyInteger.new(0)
array.each do |item|
sum = sum + item.n
end
sum
end
end
class MyInteger
sig { returns(Integer) }
attr_reader :value
sig { params(value: Integer).void }
def initialize(value)
@value = T.let(value, Integer)
end
sig { params(another: MyInteger).returns(MyInteger) }
def +(another)
MyInteger.new(@value + another.value)
end
end
class MyStruct
sig { returns(MyInteger) }
attr_reader :n
sig { params(n: MyInteger).void }
def initialize(n:)
@n = T.let(n, MyInteger)
end
end
# lib/sorbet_sample.rb:54: This code is untyped https://srb.help/7018
# 54 | array.reduce(MyInteger.new(0)) do |memo, item|
# 55 | memo + item.n
# 56 | end
#
# lib/sorbet_sample.rb:54: This code is untyped https://srb.help/7018
# 54 | array.reduce(MyInteger.new(0)) do |memo, item|
# ^^^^
#
# lib/sorbet_sample.rb:54: This code is untyped https://srb.help/7018
# 54 | array.reduce(MyInteger.new(0)) do |memo, item|
# ^^^^
#
# lib/sorbet_sample.rb:55: This code is untyped https://srb.help/7018
# 55 | memo + item.n
# ^^^^^^
#
# lib/sorbet_sample.rb:55: This code is untyped https://srb.help/7018
# 55 | memo + item.n
# ^^^^^^^^^^^^^
# Errors: 5
@a-suenami
Copy link
Author

memoitem は同じ型じゃないといけない感じですね。(初歩的でした…

@a-suenami
Copy link
Author

a-suenami commented Jun 30, 2019

これでいけた。

diff --git a/lib/sorbet_sample.rb b/lib/sorbet_sample.rb
index ac7c8a5..b91fd08 100644
--- a/lib/sorbet_sample.rb
+++ b/lib/sorbet_sample.rb
@@ -50,8 +50,8 @@ class SorbetSample
       T::Array[MyStruct]
     )

-    array.reduce(MyInteger.new(0)) do |memo, item|
-      memo + item.n
+    array.map(&:n).reduce(MyInteger.new(0)) do |memo, item|
+      memo + item
     end
   end

@a-suenami
Copy link
Author

array.map(&:n).reduce(MyInteger.new(0), :+)

だとダメ。

lib/sample.rb:53: This code is untyped https://srb.help/7018
    53 |    array.map(&:n).reduce(MyInteger.new(0), :+)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Errors: 1

こうなる。 😿

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment