[#117021] [Ruby master Feature#20318] Pattern matching `case ... in` support for triple-dot arguments — "bradgessler (Brad Gessler) via ruby-core" <ruby-core@...>

Issue #20318 has been reported by bradgessler (Brad Gessler).

11 messages 2024/03/01

[#117027] [Ruby master Bug#20319] Singleton class is being frozen lazily in some cases — "andrykonchin (Andrew Konchin) via ruby-core" <ruby-core@...>

Issue #20319 has been reported by andrykonchin (Andrew Konchin).

8 messages 2024/03/01

[#117036] [Ruby master Bug#20321] `require': cannot load such file — "Justman10000 (Justin Nogossek) via ruby-core" <ruby-core@...>

Issue #20321 has been reported by Justman10000 (Justin Nogossek).

14 messages 2024/03/01

[#117067] [Ruby master Feature#20326] Add an `undefined` for use as a default argument. — "shan (Shannon Skipper) via ruby-core" <ruby-core@...>

Issue #20326 has been reported by shan (Shannon Skipper).

7 messages 2024/03/06

[#117115] [Ruby master Feature#20331] Should parser warn hash duplication and when clause? — "yui-knk (Kaneko Yuichiro) via ruby-core" <ruby-core@...>

Issue #20331 has been reported by yui-knk (Kaneko Yuichiro).

11 messages 2024/03/12

[#117147] [Ruby master Feature#20335] `Thread.each_caller_location` should accept the same arguments as `caller` and `caller_locations` — "byroot (Jean Boussier) via ruby-core" <ruby-core@...>

Issue #20335 has been reported by byroot (Jean Boussier).

13 messages 2024/03/14

[#117157] [Ruby master Misc#20336] DevMeeting-2024-04-17 — "mame (Yusuke Endoh) via ruby-core" <ruby-core@...>

Issue #20336 has been reported by mame (Yusuke Endoh).

15 messages 2024/03/14

[#117212] [Ruby master Feature#20345] Add `--target-rbconfig` option to mkmf — "katei (Yuta Saito) via ruby-core" <ruby-core@...>

Issue #20345 has been reported by katei (Yuta Saito).

9 messages 2024/03/18

[#117240] [Ruby master Feature#20350] Return chilled string from Symbol#to_s — "Dan0042 (Daniel DeLorme) via ruby-core" <ruby-core@...>

Issue #20350 has been reported by Dan0042 (Daniel DeLorme).

10 messages 2024/03/19

[#117288] [Ruby master Misc#20387] Meta-ticket for ASAN support — "kjtsanaktsidis (KJ Tsanaktsidis) via ruby-core" <ruby-core@...>

Issue #20387 has been reported by kjtsanaktsidis (KJ Tsanaktsidis).

10 messages 2024/03/22

[#117321] [Ruby master Bug#20393] `after_fork_ruby` clears all pending interrupts for both parent and child process. — "ioquatix (Samuel Williams) via ruby-core" <ruby-core@...>

Issue #20393 has been reported by ioquatix (Samuel Williams).

6 messages 2024/03/26

[#117324] [Ruby master Feature#20394] Add an offset parameter to `String#to_i` — "byroot (Jean Boussier) via ruby-core" <ruby-core@...>

Issue #20394 has been reported by byroot (Jean Boussier).

16 messages 2024/03/26

[#117341] [Ruby master Feature#20396] ObjectSpace.dump_all(string_value: false): skip dumping the String contents — "byroot (Jean Boussier) via ruby-core" <ruby-core@...>

Issue #20396 has been reported by byroot (Jean Boussier).

8 messages 2024/03/27

[#117390] [Ruby master Feature#20404] `2pi` — "mame (Yusuke Endoh) via ruby-core" <ruby-core@...>

Issue #20404 has been reported by mame (Yusuke Endoh).

9 messages 2024/03/31

[ruby-core:117077] [Ruby master Feature#20326] Add an `undefined` for use as a default argument.

From: "zverok (Victor Shepelev) via ruby-core" <ruby-core@...>
Date: 2024-03-07 17:38:34 UTC
List: ruby-core #117077
Issue #20326 has been updated by zverok (Victor Shepelev).


> Personally, I don't like an API that distinguishes between "nil is passed" and "nothing is passed". 

Unfortunately, such APIs are sometimes unavoidable, especially in implementing various generic algorithms (and not business logic).

Take, for example, `Hash#fetch`. `fetch('key')` and `fetch('key', nil)` have different meanings. If such an API is to be implemented in Ruby, there are several options:
* use the "value provided" guard like discussed in this ticket (`default = UNDEFINED` or `default = (default_not_set = true))`;
* use `(*args)` and then check real arguments provided in the method body (by `.count` or some form of pattern matching).

C implementations of the core methods do this constantly (either argument count check, or pattern matching-like `rb_scan_args`), demonstrating the necessity. Maybe having the default way to say "argument was not provided" will help to define cleaner APIs.

Another common case is search algorithms, where the initial value for the `found` local variable is set to some sentinel value and checked after the algorithm (while having `found == nil` might be a legitimate case of "value is found, and it is `nil`"). Alternative, is, again, to have an additional boolean `is_found = false` and when the answer is found, set _two_ local vars.

For these reasons, I think I saw a lot of codebases (including some written by me and my colleagues) going with some kind of `UNDEFINED`/`NOT_SET` constant, which feels like a kind-of hack, but still clearer than alternatives.

That being said, I am not sure I am in favor of having `nil`/`undefined` distinction in Ruby, and never proposed it myself (while considering it several times).

----------------------------------------
Feature #20326: Add an `undefined` for use as a default argument.
https://bugs.ruby-lang.org/issues/20326#change-107151

* Author: shan (Shannon Skipper)
* Status: Feedback
----------------------------------------
Variations around `UNDEFINED = Object.new` are a fairly common pattern to see used as default arguments to distinguish between `nil` and no argument provided. For example, a Ruby implementation of Array#count might look something like:

``` ruby
class Array
  UNDEFINED = Object.new
  def UNDEFINED.inspect = 'UNDEFINED'
  UNDEFINED.freeze

  def count(item = UNDEFINED)
    if item == UNDEFINED
      # ...
    end
  end
end
```

I'd like to propose adding an `undefined` module function method on Kernel to remove the boilerplate for this fairly common use case. An `__undefined__` method or `__UNDEFINED__` keyword would be alternatives to `undefined`. An `undefined?` helper would also be an optional nicety:

``` ruby
class Array
  def count(item = undefined)
    if item.undefined?
      # ...
    end
  end
end
```

A Ruby implementation might look like:

``` ruby
module Kernel
  UNDEFINED = Object.new
  def UNDEFINED.inspect = -'undefined'
  UNDEFINED.freeze
  private_constant :UNDEFINED

  def undefined? = self == UNDEFINED

  module_function

  def undefined = UNDEFINED
end
```




-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/

In This Thread