Last active
June 30, 2019 03:51
-
-
Save a-suenami/5c0a02488a0e679c01eb0d5402e71dec to your computer and use it in GitHub Desktop.
Sorbet sample
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
これでいけた。
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
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
memo
とitem
は同じ型じゃないといけない感じですね。(初歩的でした…