Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Handle to_h with block in Style/HashTransformKeys and Style/HashTransformValues #8517

Merged
merged 1 commit into from Aug 11, 2020

Conversation

eugeneius
Copy link
Contributor

Followup to #7663.

Since Ruby 2.6, Hash#to_h accepts a block which is called with each pair and must return a key and value to include in the new hash: https://rubyreferences.github.io/rubychanges/2.6.html#to_h-with-a-block

If either the key or the value are always returned unchanged, using Hash#transform_keys or Hash#transform_values is faster and clearer.

This is similar to the existing logic that detects map { ... }.to_h.


Before submitting the PR make sure the following are checked:

  • Wrote good commit messages.
  • Commit message starts with [Fix #issue-number] (if the related issue exists).
  • Feature branch is up-to-date with master (if not - rebase it).
  • Squashed related commits together.
  • Added tests.
  • Added an entry to the Changelog if the new code introduces user-observable changes. See changelog entry format.
  • The PR relates to only one subject with a clear title and description in grammatically correct, complete sentences.
  • Run bundle exec rake default. It executes all tests and RuboCop for itself, and generates the documentation.

@@ -81,6 +81,17 @@
RUBY
end

it 'flags _.to_h {...} when transform_values could be used' do
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it should necessary to detect it only for Ruby 2.6 or higher. It should not detected in Ruby 2.5 or lower.

% ruby -v
ruby 2.5.8p224 (2020-03-31 revision 67882) [x86_64-darwin17]

% ruby -e "p({a: 1, b: 2, c: 3}.to_h { |k, v| [k, -v] })"
{:a=>1, :b=>2, :c=>3}

% ruby -e "p({a: 1, b: 2, c: 3}.transform_values { |v| -v })"
{:a=>-1, :b=>-2, :c=>-3}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed, thanks @koic! 🙇

Since Ruby 2.6, `Hash#to_h` accepts a block which is called with each
pair and must return a key and value to include in the new hash.

If either the key or the value are always returned unchanged, using
`Hash#transform_keys` or `Hash#transform_values` is faster and clearer.

This is similar to the existing logic that detects `map { ... }.to_h`.
@eugeneius eugeneius force-pushed the hash_transformation_to_h_with_block branch from 2be0656 to 6f754c5 Compare August 11, 2020 15:31
@koic koic merged commit 6d96917 into rubocop:master Aug 11, 2020
@koic
Copy link
Member

koic commented Aug 11, 2020

Good catch! Thanks @eugeneius!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants